一个C# AnyCPU项目是否可以包含一个特定平台的dll?

6
我们的产品基于一堆C++项目,但现在我们正在使用C#项目作为前端。我们现在也正在做一个64位版本。
我们的计划是将所有的C# dll构建为AnyCPU。C#项目将引用公共bin文件夹中的C++ dlls。在构建x64时,bin文件夹将包含我们的c++ dll的x64版本,在构建Win32时,bin文件夹将包含我们的C++ dll的32位版本。因此,C#项目将构建AnyCPU,但包含x64或Win32 c++ dll之一。
我的问题是,这会起作用吗?在运行时,一切都应该是32位或64位,取决于我们运行哪个exe文件,但编译时是否可以处理包含特定于平台的dll的AnyCPU项目?或者我们必须制作所有C# dll的特定于平台的版本?
谢谢
4个回答

8
这主要是一个部署问题,需要为正确的操作系统选择正确的DLL。如果您创建两个安装项目(一个用于x86,另一个用于x64),这将变得非常简单。
使其透明工作也是可能的。您可以在包含EXE的目录中创建x86和x64子目录,并将32位和64位DLL的构建分别放置在这些子目录中。在启动时,检查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);

使用后构建事件来复制DLL文件。使用Environment.SetEnvironmentVariable()将目录附加到PATH环境变量是另一种方法。

3
据我所记,这个方法是可行的。我只有32位的DLL文件,用C#编译后启动时会崩溃。如果你将64位的DLL文件放在那里,我认为你不需要重新编译C#代码。

2
我已经完成了。尽管出现了编译警告。

2

应该可以运行,我之前用过这种方法,而且效果很好。你得到了哪些编译警告?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接