如何根据CPU架构使用正确的非托管DLL文件? (32/64位)

时间:2010-09-03 19:00:32

标签: .net c++ 32bit-64bit

我必须使用ASP.NET站点的C ++ DLL文件。该站点将托管在32位和64位环境中。

我有一个32位和64位版本的非托管DLL文件。如何根据当前的服务器体系结构从正确的方法导入方法?

与发布的人一样,这可以作为部署问题处理。我担心的是:使用此DLL文件的Web应用程序非常庞大,而且我们没有部署文档。没有人会记得部署正确的DLL文件,所以我试图从解决方案中删除人为因素:)

3 个答案:

答案 0 :(得分:5)

最简单的方法是在两个不同的目录中为两个本机库提供相同的文件名,然后adjust your application DLL search path取决于位数。

http://www.pinvoke.net/default.aspx/kernel32.setdlldirectory

答案 1 :(得分:1)

让编译器/框架完成您需要的大部分工作

  1. 有多个构建'平台'(通常是x86,x64 - 删除AnyCPU)
  2. 为每个构建配置设置每个“平台目标”配置
  3. 我们添加了条件编译符号__WIN32& __X64
  4. 根据平台列出您的功能的不同实现,包括不同的dll名称,如果您需要同时安装两者。

    #if __WIN32
            public delegate int Move(int target);
            [DllImport("my.dll", SetLastError = true, CharSet = CharSet.Auto)]
    #elif __X64
            public delegate int Move(int target);
            [DllImport("my64.dll", SetLastError = true, CharSet = CharSet.Auto)]
    #endif
    

    否则,您可以使用loadlib并自行管理编组。

答案 2 :(得分:1)

我们知道我们无法使用添加引用添加非托管DLL文件。因此,根据在项目目录中添加DLL文件的CPU架构,我们需要一种替代方法来处理非托管DLLS文件。

  1. 在名为x32和x64的项目中创建新文件夹。
  2. 根据架构将DLL文件复制到这些文件夹中。
  3. 选择文件并打开属性,更改"复制到输出目录:始终复制"
  4. 对两个文件夹中的所有文件重复此操作
  5. 现在,在构建项目的任何平台上构建项目,x86和x64文件夹都将被复制到bin文件夹中。 当它将在服务器上运行时,它将根据CPU架构使用非托管DLL文件。