任何cpu和x64之间的托管代码引用

CSh*_*Man 5 .net c# mixed-mode c++-cli

我有一个混合模式C++/CLI项目,编译为x86和x64冻结dll.

我有一个需要使用这个项目的C#应用​​程序,编译为"任何CPU".如何从c#app正确引用正确的dll?如果我右键单击添加引用,我必须只选择2个dll中的一个.
我的"任何CPU"C#应用程序有时会运行为x64,有时运行为x86进程.

我听说你可以通过智能配置文件来做到这一点.

Han*_*ant 5

有几种方法可以解决这个问题.第一个是最简单的,承认你的应用程序实际上确实依赖于目标架构.并且AnyCPU不是正确的设置.这是非常罕见的需要堆积如山的虚拟地址内存空间从64位得到的,特别是因为你还想要和需要,使之在x86工作.因此,将EXE的平台目标设置为x86,您就完成了.

其次是结论是这只是一个部署问题.当您的应用程序安装在64位操作系统上时,您所要做的就是复制混合模式程序集的x64版本,x86构建在32位操作系统上.您需要创建一个负责此操作的安装项目.最简单的方法是创建其中两个.也是唯一的方式afaik.

第三个是铃声在哪里工作,无论是哪种方式,你无疑要询问的那个.这需要更改代码,项目和安装程序.你需要做的是编写一个post-build事件,创建两个名为"x86"和"x64"的子目录.并将相应版本的DLL复制到其中.这可确保CLR无法找到这些程序集.

在您的代码中,您必须为AppDomain.CurrentDomain.AssemblyResolve事件编写事件处理程序.在尝试使用程序集中的任何类型之前,请在Main()方法中对其进行订阅.事件处理程序必须使用Assembly.LoadFrom()根据IntPtr.Size的值从子目录加载正确的程序集.在64位模式下运行时为8.

我应该提一下另一种方法,但这在SO上通常不赞成.将两个程序集安装到GAC中.一切都是自动的.


Jar*_*Par 2

即使您的 C++ 项目编译两次,它也应该对 x86 和 x64 DLL 具有相同的托管接口。因此,只要您不使用强名称签名,引用哪个版本的 DLL 就无关紧要。重要的是在目标机器上部署正确的版本。