2017-11-05 3 views
2

Entschuldigung, wenn das eine sehr naive Frage ist. Ich habe vor einiger Zeit eine Windows Form-Anwendung mit .Net 4.5 geschrieben. Vor kurzem dachte ich, es wäre eine gute Idee, es in eine .Net Standard 2.0 Anwendung mit VS Code zu portieren.Portieren von Windows Forms zu .Net-Standard 2.0

Es gab ein paar Probleme mit fehlenden Bibliotheken und Klassen (System.ServiceModel ist die größte Lücke), aber ich habe es geschafft, die Anwendung erfolgreich zu erstellen. Allerdings, wenn ich komme, um sie auszuführen, sehe ich die folgenden Fehler:

Unhandled Exception: System.BadImageFormatException: Could not load file or assembly 'System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. Reference assemblies should not be loaded for execution. They can only be loaded in the Reflection-only loader context. (Exception from HRESULT: 0x80131058) ---> System.BadImageFormatException: Cannot load a reference assembly for execution. 

Hier ist die Projektdatei, wenn es sinnvoll ist:

<Project Sdk="Microsoft.NET.Sdk"> 

<ItemGroup> 
<PackageReference Include="log4net" Version="2.0.8" /> 
<PackageReference Include="Microsoft.CSharp" Version="4.4.0" /> 
<PackageReference Include="Newtonsoft.Json" Version="10.0.3" /> 
<PackageReference Include="NUnit" Version="3.8.1" /> 
<PackageReference Include="System.CodeDom" Version="4.4.0" /> 
<PackageReference Include="System.Configuration" Version="2.0.5" /> 
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.0" /> 
<PackageReference Include="System.Net.Http" Version="4.3.3" /> 
<PackageReference Include="System.ServiceModel" Version="1.0.0" /> 
<PackageReference Include="System.ServiceModel.Security" Version="4.4.0" /> 
<PackageReference Include="System.Windows.Forms" Version="4.0.0.0" /> 
</ItemGroup> 

<PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp2.0</TargetFramework> 
</PropertyGroup> 

</Project> 

Gibt es eine Möglichkeit, die Anwendung unter Verwendung der System.Windows läuft .Forms-Bibliothek, oder sollte ich es durch eine andere Bibliothek für .Net Standard 2.0 ersetzen?

+0

"Vor kurzem dachte ich, es wäre eine gute Idee, es in eine .Net Standard 2.0-Anwendung mit VS-Code zu portieren." Das ist nur eine gute Idee, wenn Windows Forms vollständig unter Linux und Mac unterstützt wird. Das heißt, möglicherweise nie und schon gar nicht bald. Das .NET Framework wird nicht verschwinden. Anwendungen, die immer noch stark an Windows gebunden sind, sollten sie weiterhin verwenden. Wenn Sie portieren, um zu portieren, tun Sie das nicht. Wenn Sie portieren, weil Sie möchten, dass es anderswo läuft, werfen Sie einen Blick auf Mono. –

+0

Winforms ist nicht in .net-Kern verfügbar (der Hauptzweck ist plattformübergreifende .net-Entwicklung) und es ist sehr wahrscheinlich, dass es nie (zumindest nicht in naher Zukunft). – Evk

+0

Übrigens, Refactoring-Code, der keine Abhängigkeiten von Forms zu einer .NET Standard-Bibliothek * hat, ist * lohnenswert. Dies maximiert die Wiederverwendbarkeit eines solchen Codes. Standard-Anwendungscode, der an keiner anderen Stelle verwendet wird, ist nicht von Vorteil (es sei denn, Sie müssen ihn erneut auf anderen Plattformen ausführen). –

Antwort

6

Sie können keine Anwendung erstellen, die auf .NET Standard 2.0 abzielt. Nur Bibliotheken können auf .NET Standard abzielen. Anwendungen müssen immer noch auf eine bestimmte Laufzeit abzielen - .NET Framework, .NET Core, Xamarin, etc.

Nach Ihrer Projektdatei zu urteilen, zielen Sie eigentlich auf .NET Core 2.0 ab.

System.Windows.Forms ist Teil des .NET Framework (und Mono). Es existiert nicht als Teil von .NET Standard oder .NET Core.

Ihre Projektdatei hat eine PackageReference zu System.Windows.Forms, die this NuGet Paket ziehen wird. Es ist inoffiziell und nicht gelistet. Es ist sehr Beschreibung ist "nicht unterstützte Bibliothek".

Die DLL in diesem Paket ist nur eine Referenzbaugruppe, d. H. Keine der Methoden enthält einen tatsächlichen Code. Diese Assembly enthält nur Definitionen.

Dies ist, was die Fehlermeldung bedeutet "Referenz-Assemblys sollten nicht zur Ausführung geladen werden." Die Assembly in diesem Paket lässt Sie kompilieren, aber sonst nichts.

Es gibt keine formale Möglichkeit, eine Windows Forms-Anwendung auf .NET Core auszuführen. Es kann von Vorteil sein, unsere Geschäftslogik in eine .NET-Standard-Assembly zu integrieren, aber Ihre Benutzeroberfläche muss weiterhin eine .NET Framework-Anwendung sein.

+0

Danke für Ihre Kommentare - ich vermutete, dass dies der Fall war. Um zum .NET-Standard 2.0 zu wechseln, schlagen Sie vor, welche Bibliothek Sie für die Benutzeroberfläche verwenden. Ist Xamarin.Forms die beste Wahl? – user304582

+0

Ich denke, die ganze Idee ist es, .NET Standard für all Ihre Logik zu verwenden, während Ihre Benutzeroberfläche so "dumm" wie möglich sein muss. Auf diese Weise können Sie für jede Plattform verschiedene Benutzeroberflächen erstellen, die Logik jedoch für alle Plattformen wiederverwenden. https: //www.hanselman.com/blog/HowToReferenceANETCoreLibraryInWinFormsOrNETStandardExplained.aspx – NPras

Verwandte Themen