用于 C# 库的 C++/CLI 库的 NuGet 包



为混合模式 C++/CLI 库构造 NuGet 包的正确方法是什么?

我有 32 位和 64 位版本的 dll,以及使用它的 ASP.NET Core 应用程序(仅针对完整的 .NET 框架),它将为两个平台构建。该应用程序的解决方案平台是"AnyCPU"。

我尝试使用/runtimes/文件夹,但 Visual Studio 找不到要编译的托管代码。

目前我有 2 个包,例如"MyLibrary"和"MyLibrary64",dll 在/lib/文件夹中,条件PackageReference在我的 csproj 中,但这感觉不对。此外,当我在 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 位)运行,因此不幸的是两者都是必需的。

正如 Hans 已经指出的那样,C++/CLI 项目的平台必须与托管代码的运行模式相匹配。因此,如果以 64 位进程加载,则引用设置为x86的 (混合模式) 程序集设置为AnyCPU的程序集可能始终无法加载。

我知道有三种方法可以解决此问题:

首先,遵守警告,并确保加载程序集的进程始终是 32 位进程。我不推荐这个。

其次,将应用程序切换到x86,以保证它始终在 32 位进程中运行。这是最简单,最干净的方法,但它将您固定到32位。

第三,创建一个 NuGet 包,其中包含混合程序集的 32 位和 64 位版本以及自动加载程序开关。为此,需要确保找不到混合程序集(即通过在 NuGet 包中重命名它),并且有一个AnyCPU程序集向加载混合程序集的 32 位或 64 位版本的事件处理程序注册AppDomain.AssemblyResolve,具体取决于当前进程。

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

最新更新