我有一个混合模式的C ++ / CLI项目,它被编译为x86和x64冻结的dll。
我有一个需要使用这个项目的C#应用程序,编译为“任何CPU”。 如何从c#app正确引用正确的dll? 如果我右键单击添加引用,我必须只选择2个dll中的一个 我的“任何CPU”C#应用程序有时会运行为x64,有时运行为x86进程。
我听说你可以通过智能配置文件来做到这一点。
答案 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版本就无关紧要。重要的是在目标机器上部署了正确的版本。