gpt4 book ai didi

c# - C# AnyCPU 项目能否包含平台特定的 dll

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:06 25 4
gpt4 key购买 nike

我们的产品基于大量 C++ 项目,但我们现在将 C# 项目用于前端。我们现在也在做 64 位版本。
我们的计划是将所有 C# dll 构建为 AnyCPU。 C# 项目将引用公共(public) 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 的平台特定版本?谢谢

最佳答案

这主要是一个部署问题,为正确的操作系统选择正确的 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 环境变量是另一种方法。

关于c# - C# AnyCPU 项目能否包含平台特定的 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4725506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com