c# - 为混合平台(32、64)编译并引用在运行时解析的 32 或 64 位 DLL

标签 c# c++ dll

在 32 位或 64 位 Windows 下使用 VS2010。 我们的 C# 应用程序调用与非托管 DLL 接口(interface)的第 3 方 DLL(托管)。 第 3 方 DLL API 在 32 位或 64 位中看起来相同,尽管在其下方链接到 32 位或 64 位非托管 DLL。

我们希望我们的 C# 应用程序在 32 位或 64 位操作系统上运行,理想情况下它将自动检测操作系统并加载适当的第 32 方 DLL - 通过一个测试环境的简单工厂类。因此,最简洁的解决方案是包含以下内容的运行时文件夹: OurApp.exe 3rdParty32.DLL 3rdPartyUnmanaged32.DLL 3rdParty64.DLL 3rdPartyUnmanaged64.DLL

但是,托管的 3rdParty 32 和 64 dll 的接口(interface)是相同的,因此不能在同一 VS2010 项目中引用两者:添加第二个时会显示警告三角形,但不会引用它。

创建两个额外的库 DLL 项目来引用 3rdParty 32 和 64 Dll 是我唯一的答案吗?所以我最终会得到这个项目安排: 项目 1:构建 OurApp.exe,为 project2 或 project3 动态创建一个对象。 项目 2:构建引用 3rdParty32.dll 的 OurApp32.DLL 项目 3:构建引用 3rdParty64.dll 的 OurApp64.DLL

最佳答案

由于您拥有特定于 32 位或 64 位的非托管代码,因此您失去了托管代码能够在运行时 JIT 进入任一模式的优势。最简单的方法可能是设置 make 文件两次构建应用程序,一次用于 64 位,一次用于 32 位,并使用 csproj 文件中的条件部分来引用 32 位或 64 位非托管 DLL。让安装程序安装适用于安装时找到的平台的二进制文件。

关于c# - 为混合平台(32、64)编译并引用在运行时解析的 32 或 64 位 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528639/

相关文章:

c# - 我的程序停留在 Process.WaitForExit();

c# - 替换 OpenXML 中的内容控件

c# - 如何从 C# 使用 C++ dll

c++ - 指向 void 函数中的类的指针

c++ - 为什么 STL::list 复制添加到列表中的元素?

c++ - 为什么在内联构造函数中访问静态成员时链接器失败

c# - 即使我更改了主机上的时钟,也能获得真实的 DateTime (c#)

c++ - vector 数组还是数组 vector ?

python - 导入 cv2 : ImportError: DLL load failed: windows 7 Anaconda 4. 3.0(64 位)Python 3.6.0

c# - 使用 C# dll 时,C++ 应用程序无法初始化 (0xc0000005)