.NET 6 Windows Forms saját vezérlő probléma
2021-12-06T19:12:29+01:00
2021-12-09T21:04:12+01:00
2022-08-12T06:05:29+02:00
Seemann56
Sziasztok! .NET Framework esetében elkészítettem a vezérlőt, a Toolbox-ban kitallóztam a .dll fájlt, és használhattam a vezérlőt. A .NET 6 esetében ez (nálam) nem működik, hibajelzést kapok. Hozzá kell adnom a teljes vezérlő projektet, (projekteket) a készülő alkalmazásomhoz, csak így jelenik meg a vezérlőm a Toolbox-ban. Van valami trükk, valamit nem jól csinálok, vagy ezután ez csak így működik?
Mutasd a teljes hozzászólást!
Végül találtam egy meglehetősen körülményes módszert, de legalább működik.

1) Fordítsd újra a DLL-t, de állítsd be a csproj-ban, hogy több .NET verziót targeteljen, mivel supportálni kell a régi .NET Framework 4.8-at is:

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net48;net6.0-windows</TargetFrameworks> <LangVersion>7.3</LangVersion> <OutputType>library</OutputType> </PropertyGroup> <ItemGroup Condition="'$(TargetFramework)' == 'net48'"> <Reference Include="System.Windows.Forms"/> </ItemGroup> <PropertyGroup Condition="'$(TargetFramework)' == 'net6.0-windows'"> <UseWindowsForms>true</UseWindowsForms> </PropertyGroup> </Project>
2) Most release módban csináljunk belőle NuGet package-et:

dotnet pack -c Release
3) Az elkészült nupkg fájlt tedd be egy mappába. Ezt a mappát a NuGet Package Manager beállításaiban add hozzá, mint Package Source.
4) Hivatkozzuk be a NuGet Package Managerrel a szép új NuGet csomagunkat a WinForms projektben.

Ha megnyitod a Form-ot a Designerben és a Toolbox-ot, látnod kell a user control-t.

Btw, a Microsoft elvileg tud a problémáról, gyakorlatilag még mindig nem fixálta a problémát.
Mutasd a teljes hozzászólást!

  • A hibaüzenet azért elég fontos információ lenne, anélkül csak azt tudom elmondani, hogy én hogyan csináltam, hogy működött.

    1) Létrehoztam egy új .NET 6-ot targetelő Windows Forms projektet.
    2) A projekt mellé csináltam egy új Class Library-t, ami szintén .NET 6-ot targetel.
    3) A Class Library csproj fájljába beleírtam ezeket:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <!-- ezek voltak benne eddig is --> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> <!-- ezeket adtam hozzá --> <UseWindowsForms>true</UseWindowsForms> <TargetFramework>net6.0-windows</TargetFramework> <OutputType>library</OutputType> </PropertyGroup> </Project>
    4) Felvettem egy teljesen új user control-t a Class Library projektbe:

    using System.Diagnostics; namespace MyControl { public class MyUserControl : ComboBox { [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)] public string MyProperty { get; set; } } }
    Itt most nekem egy solution-ben van a két projekt, de direkt nem project reference-et adtam hozzá, hanem assembly reference-et.
    5) Felvettem assembly reference-ként a WinForms projektben a ClassLib által buildelt DLL-t.

    És így nekem működött rendesen.
    Mutasd a teljes hozzászólást!
  • Szia! Köszi, hogy foglalkozol a problémámmal! Még emésztenem kell, hogy Te hogy csináltad.
    1) OK
    2) Sosem gondoltam volna, hogyha user controlt akarok felvenni a projectembe, hozzá kell adnom egy új osztályt.
    3) OK be fogom írni.
    4) Én egy már megírt user controlt szeretnék felvenni, van egy szekér saját készítésű control-om ...
    5) Bocsi "assembly reference" ezt hogy kell csinálni? Egy Class Library-ba több controll is felvehető?
    Holnap megpróbálom lekövetni az instrukcióidat.
    (Csatoltam az én hibaüzenetemet.)
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Ahogy olvasom itt a netet, a Visual Studio 2019-es változata még nem támogatja a .NET 6-ot targetelő user control library-ket, tehát hogy tisztázzuk: Visual Studio 2022-t használsz, és az dobja ezt a hibát?
    Mutasd a teljes hozzászólást!
  • Igen, a Visual Studio 2022-t használom. A Visual Studio 2019-el és .NET Framework-al semmi problémám nem volt e téren, de tervezem az átállást .NET 6-ra. Ezért kezdtem el kísérletezni, próba projekteket írni.
    Mutasd a teljes hozzászólást!
  • Én egy már megírt user controlt szeretnék felvenni, van egy szekér saját készítésű control-om

    Tehát ha jól értem, .NET Framework-re írt control-okat szeretnél használni .NET 6 alatt? Csak arra tudok gondolni, hogy muszáj leszel ezeket a control-okat újrafordítani .NET 6 alá. Kételkedek abban, hogy a .NET Framework-re fejlesztett assembly hivatkozható .NET 6-ban.
    Mutasd a teljes hozzászólást!
  • NEM, .NET 6 alatt írt control-okat szeretnék használni .NET 6 Windows Forms projektben. Ha a control project-et betettem a főprogram mellé, és beírtam  a hivatkozást a névtérbe (pl. use myKilep;)  a Toolbox-ban megjelent a control fordítás után, és tudtam használni. A Framework-ban megszokott Choose Item ... egyszerű beemelés nem működik. (Legalábbis nálam! Remélem nem telepítési gondom van ...)
    Mutasd a teljes hozzászólást!
  • Jó, akkor ugyanazt csináltam én is.
    1) A Solution Explorer-ben a projektre jobbklikk, Add->Reference.
    2) Megjelent a Reference Manager ablak. Bal oldalán kiválasztottam a "Browse" item-et, majd a Browse gombra nyomva (alul) betallóztam a DLL-t.
    Ennek hatására a Toolbox-ban megjelent a control-om, amit készítettem a Toolbox->General szekció alatt.

    Tehát én nem a toolbox-on keresztül adtam hozzá.
    Mutasd a teljes hozzászólást!
  • Megcsináltam mindkét pontot, ahogy írtad az utolsó bejegyzésedben. Hibaüzi nélkül bekerült a dll.
    Sajna a Toolbox-ban nem jelent meg a vezérlő. Feltöltöttem egy képet is a projektről.

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>WinExe</OutputType> <TargetFramework>net6.0-windows</TargetFramework> <Nullable>enable</Nullable> <UseWindowsForms>true</UseWindowsForms> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> <ItemGroup> <Reference Include="myKilep"> <HintPath>..\..\..\MyControlsLibraryNET\myKilep\myKilep\bin\Release\net6.0-windows\myKilep.dll</HintPath> </Reference> </ItemGroup> </Project>
    Talán rájössz, mi a hiba ...
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Csináltam egy próbát. Visual Studio 2022, Windows Forms App (.NET Framework 4.6.1)
    Nem meglepő módon minden frankón működik, mint a 2019-ben. Tehát a Toolbox-on keresztül hozzáadható a vezérlés a projrekt-hez.
    Mutasd a teljes hozzászólást!
  • Az egyedi controlt tartalmazó DLL-t add hozzá a programod References-éhez, majd a programodat Build-eld.

    Emlékeim szerint csak ezután fognak megjelenni az egyedi control-ok a Tollbox-ban.


    W.
    Mutasd a teljes hozzászólást!
  • Tényleg van valami bug az új VS-ben. Nekem is sikerült előidéznem a jelenséget, és az istennek nem akarja megjeleníteni a Toolbox-ban a custom control-t. Abban bíztam, hogy a ma kiadott 17.0.2-es verzió megoldja, de nem.
    Mutasd a teljes hozzászólást!
  • Szia! Lilla is ezt javasolta, és meg is csináltam, de nem jelent meg a vezérlő. Az egyel előbbi hozzászólásomhoz csatoltam egy képet. Azt nézd meg legyél szíves. Kimondott References nincs a .NET 6 WinForms esetében, csak Dependencies (függőségek?) Tiszta sor, hogy nálam van a hiba, mert az nem lehet, hogy csak kizárólag én próbáljak saját vezérlőt feltenni egy .NET 6 WinForms-ra. Rákerestem angol nyelvű fórumokra, de sehol sem találkoztam ilyen kérdéssel.
    Mint már írtam valamelyik hozzászólásomban, ha az egyedi control-t tartalmazó project-et hozzáadom az új projekthez, csont nélkül működik. Ha csak a DLL-t akkor nem. Ha a Toolbox-hoz próbálom hozzáadni a DLL-t. hibaüzenetet dob. Ezt a képernyőképet is csatoltam valamelyik hozzászólásomban.
    Egy nagyon egyszerű kilép gombbal próbálkoztam, ez a kód:

    using System.ComponentModel; namespace myKilep { [ToolboxItem(true)] [ToolboxBitmap(@"d:\C_sharp_2022\myClass\Picture\exit2.bmp")] public partial class Kilep : UserControl { [Description("Kattintáskor lefut. Van egy PrgKattint eljárás is! Így programból meghívható a Click esemény"), Category("Misc")] public event EventHandler? Bezar; public Kilep() { InitializeComponent(); } private void Kilep_Load(object sender, EventArgs e) { ToolTip toolTipKilep = new ToolTip(); toolTipKilep.ShowAlways = true; toolTipKilep.SetToolTip(btnClose, "Kilép"); } /// <summary> /// PrgKattint segítségével programból meghívható a Click esemény /// </summary> public void PrgKattint() { this.btnClose.PerformClick(); } private void btnClose_Click(object sender, EventArgs e) { if (this.Bezar != null) this.Bezar(this, new EventArgs()); if (System.Windows.Forms.Application.MessageLoop) { // WinForms app System.Windows.Forms.Application.Exit(); } else { // Console app System.Environment.Exit(1); } } } }
    Csatolom a kilép gomb projektjének Properties kis részletét is.
    Ha van ötlet, bármit kipróbálok, amit javasoltok ...
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Na, ez azért megnyugtató számomra, hogy Te is tudtad produkálni a hibát!
    Azt nem értem, a világon másnak ez nem tűnt fel? Lottózzak? Ezek szerint bele tudok nyúlni a jóba!
    Mutasd a teljes hozzászólást!
  • Végül találtam egy meglehetősen körülményes módszert, de legalább működik.

    1) Fordítsd újra a DLL-t, de állítsd be a csproj-ban, hogy több .NET verziót targeteljen, mivel supportálni kell a régi .NET Framework 4.8-at is:

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net48;net6.0-windows</TargetFrameworks> <LangVersion>7.3</LangVersion> <OutputType>library</OutputType> </PropertyGroup> <ItemGroup Condition="'$(TargetFramework)' == 'net48'"> <Reference Include="System.Windows.Forms"/> </ItemGroup> <PropertyGroup Condition="'$(TargetFramework)' == 'net6.0-windows'"> <UseWindowsForms>true</UseWindowsForms> </PropertyGroup> </Project>
    2) Most release módban csináljunk belőle NuGet package-et:

    dotnet pack -c Release
    3) Az elkészült nupkg fájlt tedd be egy mappába. Ezt a mappát a NuGet Package Manager beállításaiban add hozzá, mint Package Source.
    4) Hivatkozzuk be a NuGet Package Managerrel a szép új NuGet csomagunkat a WinForms projektben.

    Ha megnyitod a Form-ot a Designerben és a Toolbox-ot, látnod kell a user control-t.

    Btw, a Microsoft elvileg tud a problémáról, gyakorlatilag még mindig nem fixálta a problémát.
    Mutasd a teljes hozzászólást!
  • Köszi a segítséget!
    Azért az lesz az igazi, ha kijön a javítás! Remélhetőleg hamar ...
    Mutasd a teljes hozzászólást!
abcd