用于在C#库中使用的C++/CLI库的NuGet包。

3
什么是为混合模式C++/CLI库构建NuGet包的正确方法?
我有32位和64位版本的dll,以及一个使用它的ASP.NET Core应用程序(仅针对完整的.NET框架),将为两个平台构建。该应用程序的解决方案平台为“AnyCPU”。
我尝试使用“/runtimes/”文件夹,但Visual Studio无法找到要编译的托管代码。
目前,我有2个包,如“MyLibrary”和“MyLibrary64”,其中dll在“/lib/”文件夹中,并且在我的csproj中有条件的“PackageReference”,但这感觉不对。此外,当我在VS中编译时,会得到:
warning MSB3270: There was a mismatch between the processor architecture of the project
being built "MSIL" and the processor architecture of the reference "MyLibrary.dll", "x86".
This mismatch may cause runtime failures. Please consider changing the targeted processor
architecture of your project through the Configuration Manager so as to align the
processor architectures between your project and references, or take a dependency on
references with a processor architecture that matches the targeted processor architecture
of your project.

这个问题类似,但没有答案: 创建用于C++/CLI(混合)程序集的NuGet包

更新/澄清:

该应用程序可以在IIS中托管(64位),也可以作为独立安装的应用程序(32位)运行,因此两者都是必需的。


Nuget从来没有为C++/CLI程序集提供专门的支持,因此它不会帮助你解决这个警告。但是你需要知道,你的项目很可能无法正常运行。一个asp.net应用程序可能会在64位模式下运行,无法使用该程序集的x86版本。在这种情况下,AnyCPU是相当理想主义的想法,项目的位数必须匹配原生代码的版本。请考虑是否有必要构建x86版本。 - Hans Passant
更新了问题 - Dave Thieben
这并不是澄清,它只是增加了更多未指明的一厢情愿的想法。NuGet 有用的可能性应该相当低,只需帮助操作系统找到正确的 DLL:https://dev59.com/questions/JU3Sa4cB1Zd3GeqPrgnn#2594135 - Hans Passant
我忘了最大的问题,.NETCore不支持C++/CLI。 - Hans Passant
1个回答

2
正如Hans所指出的那样,C++/CLI项目的平台必须与托管代码运行的模式匹配。因此,如果将一个设置为“AnyCPU”的程序集引用一个设置为“x86”的(混合模式)程序集,在64位进程中加载时可能会失败。
我知道三种解决方法:
第一种是接受警告,并确保加载程序集的进程始终是32位进程。我不建议这样做。
第二种方法是将应用程序切换到“x86”,这可以保证它始终在32位进程中运行。这是最简单和最干净的方法,但它将限制你的应用程序只能运行在32位系统中。
第三步,制作一个 NuGet 包,其中包含混合程序集的 32 位和 64 位版本,以及一个 自动加载器开关。为此,您需要确保混合程序集不被找到(即通过在 NuGet 包中重命名它),并且有一个 AnyCPU 程序集,该程序集使用事件处理程序注册 AppDomain.AssemblyResolve,根据当前进程加载混合程序集的 32 位或 64 位版本。

第三种方法允许提供一个 NuGet 包,其中包含可以从 AnyCPU 程序集引用的混合模式程序集。但是,请注意,AppDomain.AssemblyResolve 是一个全局概念,可能会干扰应用程序中的其他组件,这可能导致非常复杂的错误。

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