【问题标题】: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


    【解决方案1】:

    我已经做到了。虽然它给出了编译警告。

    【讨论】:

      【解决方案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 环境变量是另一种方法。

          【讨论】:

            猜你喜欢
            • 2010-11-09
            • 2012-07-22
            • 2017-08-03
            • 2017-11-03
            • 2014-04-19
            • 1970-01-01
            • 1970-01-01
            • 2018-09-07
            • 1970-01-01
            相关资源
            最近更新 更多