c# - 根据 x64/x86 更改 C# DllImport 目标代码

标签 c# dllimport windows-7-x64

我有一个外部 c++ dll 可以使用 DLLImport 导入。如果我的应用程序在 x64 中编译,我需要导入此 dll 的 x64 版本,如果它是 x86 版本,我需要 x86 dll。

实现此目标的最佳方法是什么?

理想情况下,我想要一些预处理器指令,但我知道这在 C# 中不起作用?

更多信息:DLL 正在由设置为 AnyCPU 的项目导入。父项目是确定应用程序编译为 x64 还是 x86 的项目。我们为不同的客户编译了两个版本 - 我想在两个版本中共享子项目。

最佳答案

这主要是一个部署问题,只需让您的安装程序根据目标计算机上的 Windows 版本复制正确的 DLL。

但从来没有人喜欢这样做。动态调用正确的 DLL 函数非常痛苦,您必须为每个导出函数编写委托(delegate)类型并使用 LoadLibrary + GetProcAddress + Marshal.GetDelegateForFunctionPointer 创建委托(delegate)对象。

但从来没有人喜欢这样做。不太痛苦的方法是声明该函数两次,给它不同的名称并使用 [DllImport] 属性中的 EntryPoint 属性指定真实名称。然后在要调用的运行时进行测试。

但从来没有人喜欢这样做。最有效的技巧是引导 Windows 为您加载正确的 DLL。您要做的第一件事是将 DLL 复制到 Windows 不会查找的目录中。最好的方法是在您的构建目录中创建一个“x86”和一个“x64”子目录,并将适当的 DLL 复制到每个目录中。通过编写创建目录和复制 DLL 的构建后事件来实现这一点。

然后通过调用 SetDllDirectory() 将其告知 Windows。您指定的路径将添加到 Windows 搜索 DLL 的目录中。像这样:

using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;

class Program {
    static void Main(string[] args) {
        var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        path = Path.Combine(path, IntPtr.Size == 8 ? "x64" : "x86");
        bool ok = SetDllDirectory(path);
        if (!ok) throw new System.ComponentModel.Win32Exception();
        //etc..
    }
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool SetDllDirectory(string path);
}

请考虑让代码在 64 位模式下运行是否真的对您有用。很少需要从中获得巨大的虚拟内存地址空间,这是唯一真正的好处。您仍然需要支持在 2 GB 的情况下需要正确运行的 32 位版本。

关于c# - 根据 x64/x86 更改 C# DllImport 目标代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11934570/

相关文章:

c# - 你能把 Unity 3d 游戏放在 Xamarin 跨平台应用程序中吗

c# - 获取使用大端格式 C# 进行编码的指南

c++ - 仅在调试期间在 C++ 中初始化 matlab 编译器 dll/lib 时发生访问冲突

java - SunCertPathBuilderException : unable to find valid certification path to requested target

c# - 如何在我的 WPF 项目中导入 windows.media.capture?

sql-server - 适用于 Windows7 64 位的 Golang MSSQL 驱动程序

c# - Linq 加入 3 列表 <T>

c# - 函数分析问题 - Visual Studio 2010 Ultimate

visual-studio - : app does not see func from my dll如何处理

visual-studio-2010 - Visual Studio和FORTRAN一起工作吗?