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