我有一个混合模式的 C++/CLI 项目,它被编译为 x86 和 x64 卡住的 dll。
我有一个 C# 应用程序需要使用这个编译为“任何 CPU”的项目。
如何从 c# 应用程序正确引用正确的 dll?
如果我右键单击添加引用,我必须只选择 2 个 dll 中的一个。
我的“任何 CPU”C# 应用有时会作为 x64 进程运行,有时会作为 x86 进程运行。
我听说您可以通过智能配置文件来完成此操作。
最佳答案
有几种方法可以解决这个问题。第一个最简单,承认您的应用程序实际上确实对目标体系结构具有依赖性这一事实。 AnyCPU 不是正确的设置。 非常很少需要从 x64 获得的巨大虚拟地址内存空间,尤其是因为您还希望并且需要让它在 x86 上工作。因此,将 EXE 的平台目标设置为 x86,您就完成了。
其次得出的结论是这只是一个部署问题。当您的应用程序安装在 64 位操作系统上时,您所要做的就是复制混合模式程序集的 x64 版本,而 x86 版本则安装在 32 位操作系统上。您需要创建一个安装项目来处理这个问题。最简单的方法是创建其中两个。也是 afaik 的唯一方法。
第三个是带有铃铛的那个,无论哪种方式都可以工作,您无疑会问这个。这需要更改代码、项目和安装程序。您需要做的是编写一个构建后事件,该事件创建两个子目录,名称分别为“x86”和“x64”。并将相应版本的 DLL 复制到其中。这可确保 CLR 无法找到这些程序集。
在您的代码中,您必须为 AppDomain.CurrentDomain.AssemblyResolve 事件编写事件处理程序。在您尝试使用程序集中的任何类型之前,在您的 Main() 方法中订阅它。事件处理程序必须使用 Assembly.LoadFrom() 根据 IntPtr.Size 的值从子目录加载正确的程序集。在 64 位模式下运行时为 8。
我应该提到另一种方法,但在 SO 中通常不赞成这种方法。将两个程序集都安装到 GAC 中。一切都是自动的。
关于c# - 任何 cpu 和 x64 之间的托管代码引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5196095/