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

时间:2018-03-23 14:33:23

标签: nuget c++-cli nuget-package

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

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

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

目前我有2个套餐,比如" MyLibrary"和#34; MyLibrary64",我的csproj中的/lib/文件夹中的dll和条件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.

这个问题很相似,但没有答案: Create NuGet package for C++/CLI (mixed) assembly

更新/澄清:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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