【问题标题】:Porting Windows Forms to .Net Standard 2.0将 Windows 窗体移植到 .Net Standard 2.0
【发布时间】:2017-11-05 22:16:11
【问题描述】:

抱歉,如果这是一个非常幼稚的问题。前段时间,我使用 .Net 4.5 编写了一个 Windows 窗体应用程序。最近,我认为使用 VS Code 将其移植到 .Net Standard 2.0 应用程序是一个好主意。

缺少库和类存在一些问题(System.ServiceModel 是最大的差距),但我已经到了成功构建应用程序的地步。但是,当我运行它时,我看到以下错误:

未处理的异常:System.BadImageFormatException:无法加载文件或程序集“System.Windows.Forms,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”。不应加载引用程序集以供执行。它们只能在 Reflection-only loader 上下文中加载。 (来自 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 的不同库替换它?

【问题讨论】:

  • “最近,我认为使用 VS Code 将其移植到 .Net Standard 2.0 应用程序是一个好主意。”只有当 Linux 和 Mac 完全支持 Windows 窗体时,这才是一个好主意。也就是说,可能永远不会,当然也不会很快。 .NET Framework 不会消失。仍然高度受 Windows 限制的应用程序应该继续使用它。如果您为了移植而移植,请不要。如果您移植是因为您真的希望它在其他地方运行,请查看 Mono。
  • Winforms 在 .net 核心中不可用(主要目的是跨平台 .net 开发),而且很可能永远不会(至少在不久的将来不会)。
  • 顺便说一句,将与 Forms 没有任何依赖关系的代码重构为 .NET Standard 库值得的。这最大限度地提高了此类代码的可重用性。不会在其他地方使用的标准应用程序代码不会从中受益(除非您确实需要在其他平台上运行它)。
  • @Evk:Never say never again。 :-)
  • @Heinzi 主要。 Net core 点是跨平台支持,.net core 3 上的 WinForms 只能在 windows 上运行,所以对我来说似乎没有太大的改进。

标签: c# .net winforms .net-standard-2.0


【解决方案1】:

您无法构建面向 .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 的一部分存在。

您的项目文件有一个PackageReferenceSystem.Windows.Forms,它将拉入this NuGet 包。它是非官方的和未列出的。它的描述是“不支持的库”。

该包内的 DLL 只是一个参考程序集,即没有任何方法包含任何实际代码。该程序集仅包含定义。

这就是错误消息“不应加载引用程序集以执行”的含义。该包中的程序集将让您编译,但没有别的。

没有在 .NET Core(3.0 之前)上运行 Windows 窗体应用程序的正式方法。将我们的业务逻辑放入 .NET Standard 程序集可能会有好处,但您的用户界面仍必须是 .NET Framework 应用程序。

【讨论】:

  • 感谢您的 cmets - 我怀疑是这种情况。因此,为了迁移到 .Net 标准 2.0,您建议将哪个库用于 UI。 Xamarin.Forms 是最佳选择吗?
  • 我认为整个想法是为所有逻辑使用 .NET Standard,而您的 UI 需要尽可能“愚蠢”。这样,您可以为每个平台编写不同的 UI,但在所有平台上重用逻辑。 hanselman.com/blog/…
  • 不要承诺太多。移植 UI 是如此困难,以至于他们甚至无法让设计师完成 3.0 版本。 3.1,也许,毛茸茸的大问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
相关资源
最近更新 更多