提问者:小点点

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


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

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

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

目前我有两个包,比如“MyLibrary64”和“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位),因此不幸的是两者都是必要的。


共1个答案

匿名用户

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

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

首先,接受警告,并确保加载程序集的进程始终是32位进程。我不建议这么做。

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

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

第三种方法允许提供带有混合模式程序集的NuGet包,这些程序集可以从anyCPU程序集引用。但是请注意,AppDomain.AssemblyResolve是一个全局概念,可能会干扰应用程序中的其他组件,这可能会导致非微不足道的bug。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(用于|c#|库|c++|cli|库|nuget|包)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?