【问题标题】:Can a C# AnyCPU project include a platform specific dllC# AnyCPU 项目能否包含平台特定的 dll
【发布时间】:2011-06-11 03:54:48
【问题描述】:
我们的产品基于大量 C++ 项目,但我们现在将 C# 项目用于前端。我们现在也在做 64 位版本。
我们的计划是将所有 C# dll 构建为 AnyCPU。 C# 项目将引用公共 bin 文件夹中的 C++ dll。在构建 x64 时,bin 文件夹将包含我们的 c++ dll 的 x64 版本,而在构建 Win32 时,bin 文件夹将包含我们的 C++ dll 的 32 位版本。因此,C# 项目将构建 AnyCPU,但包括 x64 或 Win32 c++ dll。
我的问题是,这行得通吗?在运行时,一切都应该是全部 32 或全部 64,具体取决于我们正在运行的 exe,但是编译时可以处理针对包含平台特定 dll 的 AnyCPU 的项目吗?还是我们必须制作所有 C# dll 的平台特定版本?
谢谢
【问题讨论】:
标签:
c#
c++
32bit-64bit
platform
【解决方案2】:
据我所知,这是可行的。
我只有 32 位 DLL,编译了 c#,它在启动时崩溃了。所以如果你把 64 位的 DLL 放在那里,我认为你不需要重新编译 C#。
【解决方案3】:
它应该可以工作,我过去使用过这种方法并且效果很好。你会得到什么样的编译警告?
【解决方案4】:
这主要是一个部署问题,为正确的操作系统选择正确的 DLL。如果您创建两个设置项目,一个用于 x86,另一个用于 x64,则非常简单。
让它透明地工作也是可能的。例如,您将在包含您的 EXE 的目录中创建一个 x86 和一个 x64 子目录,并将 DLL 的 32 位和 64 位版本分别放在这些子目录中。在启动时,检查 IntPtr.Size 以了解您的进程的位数。然后相应地调用 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);
使用构建后事件来复制 DLL。使用 Environment.SetEnvironmentVariable() 将目录附加到 PATH 环境变量是另一种方法。