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

时间:2011-03-04 15:53:43

标签: c# .net c++-cli mixed-mode

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

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

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

2 个答案:

答案 0 :(得分:5)

有几种方法可以解决这个问题。第一个是最简单的,承认您的应用实际上 依赖于目标架构这一事实。并且AnyCPU不是正确的设置。很少需要从x64获得的大量虚拟地址内存空间,尤其是因为您还需要并且需要使其在x86上运行。因此,将EXE的平台目标设置为x86,您就完成了。

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

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

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

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

答案 1 :(得分:2)

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