我们的产品基于一系列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的平台特定版本? 感谢
答案 0 :(得分:8)
这主要是一个部署问题,为正确的操作系统选择了正确的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);
使用post build事件复制DLL。使用Environment.SetEnvironmentVariable()将目录附加到PATH环境变量是另一种方法。
答案 1 :(得分:3)
据我记得,这很有效。
我只有32位DLL,c#编译并在启动时崩溃。因此,如果您放置64位DLL,我认为您不需要重新编译C#。
答案 2 :(得分:2)
我做到了。虽然它给出了编译警告。
答案 3 :(得分:2)
它应该可以工作,我过去使用过这种方法并且工作正常。你得到什么样的编译警告?