将Windows Forms移植到.Net Standard 2.0

16

如果这是一个非常幼稚的问题,我很抱歉。我曾经使用 .Net 4.5 写了一个 Windows 表单应用程序。最近,我想将其移植到使用 VS Code 的 .Net Standard 2.0 应用程序。

存在一些问题,如缺少库和类(System.ServiceModel 是最大的漏洞),但我已成功构建了该应用程序。然而,在运行它时,我看到以下错误:

未处理的异常:System.BadImageFormatException:无法加载文件或程序集“System.Windows.Forms,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”。参考程序集不应该被加载以执行。它们只能在反射上下文中加载。(HRESULT 异常:0x80131058)---> System.BadImageFormatException:无法为执行加载引用程序集。

如果有用的话,这是项目文件:

<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>

有没有一些方法可以使用System.Windows.Forms库来运行应用程序,或者我应该用不同的库替换它以适用于.Net Standard 2.0?


1
最近,我认为使用VS Code将其移植到.Net Standard 2.0应用程序是一个好主意。只有当Windows Forms在Linux和Mac上得到完全支持时,这才是一个好主意。也就是说,可能永远不会实现,而且肯定不会很快实现。.NET Framework不会消失。仍然高度依赖Windows的应用程序应该继续使用它。如果你只是为了移植而移植,那就不要移植。如果你真的想让它在其他地方运行,请看一下Mono。 - Jeroen Mostert
Winforms在.NET Core中不可用(其主要目的是跨平台.NET开发),而且很可能永远都不会(至少在不久的将来不会)。 - Evk
1
顺便提一下,将没有任何依赖于表单的代码重构为.NET Standard库是值得的。这最大化了这种代码的可重用性。标准应用程序代码如果不会在其他地方使用则没有好处(除非您确实需要在其他平台上运行它)。 - Jeroen Mostert
2
@Evk: 再也不说从此结束。 :-) - Heinzi
1
@Heinzi 主要是 .Net Core 的跨平台支持,而 .Net Core 3 上的 WinForms 只能在 Windows 上运行,所以对我来说似乎并没有太大的改进。 - Evk
1个回答

14

你不能构建一个针对 .NET Standard 2.0 的应用程序。只有库可以针对 .NET Standard 进行构建。应用程序仍然需要针对特定的运行时——.NET Framework、.NET Core、Xamarin 等。

根据你的项目文件,实际上你是针对 .NET Core 2.0 进行构建。

System.Windows.Forms 是 .NET Framework(和 Mono)的一部分。它不属于 .NET Standard 或 .NET Core。

你的项目文件中有一个 PackageReference 指向 System.Windows.Forms,这将引入 NuGet 包。它是非官方且未列出的。它的描述是“不支持的库”。

该包中的 DLL 仅是引用程序集,即其中没有任何实际代码。该程序集仅包含定义。

这就是错误消息所说的“不应为执行加载引用程序集”。该包中的程序集允许你进行编译,但不允许其他操作。

在 .NET Core(3.0 之前)上运行 Windows Forms 应用程序没有正式的方法。将业务逻辑提取到 .NET Standard 程序集中可能会有好处,但用户界面仍然必须是 .NET Framework 应用程序。


感谢您的评论 - 我怀疑情况就是这样。那么,为了转移到 .Net standard 2.0,您建议使用哪个库来处理 UI 呢?Xamarin.Forms 是最好的选择吗? - user304582
1
我认为整个想法是使用.NET Standard来处理所有逻辑,而你的UI需要尽可能“愚笨”。这样,您可以为每个平台编写不同的UI,但在所有平台上重用逻辑。 https://www.hanselman.com/blog/HowToReferenceANETCoreLibraryInWinFormsOrNETStandardExplained.aspx - NPras
不要承诺太多。UI移植非常困难,以至于他们甚至无法在3.0版本中完成设计师。也许在3.1版中会有很大的问题。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接