Joh*_*n C 6 c# c++ platform 32bit-64bit
我们的产品基于一堆C++项目,但我们现在正在使用C#项目作为前端.我们现在也在做64位版本.
我们的计划是将所有C#dll构建为AnyCPU.C#项目将在公共bin文件夹中引用C++ dll.构建x64时,bin文件夹将包含我们的c ++ dll的x64版本,在构建Win32时,bin文件夹将包含32位版本的C++ dll.所以C#项目将构建AnyCPU,但包括x64或Win32 c ++ dll.
我的问题是,这会有效吗?在运行时,所有应该是全部32或全部64取决于我们正在运行的exe,但是编译时可以处理一个项目,目标是包含特定于平台的dll的AnyCPU吗?或者我们是否必须制作所有C#dll的平台特定版本?谢谢
这主要是一个部署问题,为正确的操作系统选择了正确的DLL.如果您创建两个安装项目,一个非常直接,一个用于x86,另一个用于x64.
使其透明地工作也是可能的.例如,您在包含EXE的目录中创建x86和x64子目录,并在这些子目录中分别放置DLL的32位和64位版本.在启动时,检查IntPtr.Size以了解您的进程的位数.然后相应地pinvoke SetDllDirectory,以便Windows将找到正确的DLL.像这样:
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
...
public static void SetupDllDirectory() {
string path = Assembly.GetEntryAssembly().Location;
path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
bool ok = SetDllDirectory(path);
if (!ok) throw new System.ComponentModel.Win32Exception();
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetDllDirectory(string path);
Run Code Online (Sandbox Code Playgroud)
使用post build事件来复制DLL.使用Environment.SetEnvironmentVariable()将目录附加到PATH环境变量是另一种方法.