情况是这样的,我在我的dot中使用了一个基于C的dll.net应用程序.有两个DLL,一个是32位的MyDll32.另一个是名为MyDll64的64位版本.dll.

有一个静态变量保存着DLL文件名:string DLL_file_name.

它的使用方式如下:

[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);

到目前为止很简单.

正如你所想象的,软件是在"任何CPU"打开的情况下编译的.

我还有以下代码来确定系统应该使用64位文件还是32位文件.

#if WIN64
        public const string DLL_FILE_NAME = "MyDll64.dll";
#else
        public const string DLL_FILE_NAME = "MyDll32.dll";        
#endif

现在你应该看到问题了..DLL_FILE_NAME是在编译时定义的,而不是在执行时定义的,因此不会根据执行上下文加载正确的DLL.

处理这个问题的正确方法是什么?我不想要两个执行文件(一个32位,另一个64位)?如何设置DllImport语句中使用的DLL_FILE_NAME before

推荐答案

我发现最简单的方法是导入两个名称不同的方法,然后调用正确的方法.在调用之前,不会加载DLL,因此可以:

[DllImport("MyDll32.dll", EntryPoint = "Func1", CallingConvention = CallingConvention.Cdecl)]
private static extern int Func1_32(int var1, int var2);

[DllImport("MyDll64.dll", EntryPoint = "Func1", CallingConvention = CallingConvention.Cdecl)]
private static extern int Func1_64(int var1, int var2);

public static int Func1(int var1, int var2) {
    return IntPtr.Size == 8 /* 64bit */ ? Func1_64(var1, var2) : Func1_32(var1, var2);
}

当然,如果您有许多导入,手动维护可能会非常麻烦.

.net相关问答推荐

.NET Async / Await:状态机如何知道何时继续执行?

使用 PowerShell 从文件夹中获取文件名的最快\最好的方法是什么?

每当属性值发生变化时引发事件?

如何判断 IOException 是否为 Not-Enough-Disk-Space-Exception 类型?

在 WPF 窗口中获取当前聚焦的元素/控件

如何在 C# 中打开 Excel 文件?

RNGCryptoServiceProvider 的优缺点

ReaderWriterLock 与锁{}

实体框架无法加载指定的元数据资源

如何判断一个类型是否是简单类型?即持有一个单一的价值

.NET - 实现捕获所有异常处理程序的最佳方法是什么

String.Split 仅在 C# 中的第一个分隔符上?

.net 自定义配置如何不区分大小写解析枚举 ConfigurationProperty

.NET 事件 - 什么是对象发送者和 EventArgs e?

强制 XmlSerializer 将 DateTime 序列化为 'YYYY-MM-DD hh:mm:ss'

无法加载文件或程序集Antlr3.Runtime (1)或其依赖项之一

.NET 高级别的 .NET 4.0 和 .NET 4.5 的区别

如何使用 EPPlus 设置 XLSX 单元格宽度?

IEnumerable vs IReadonlyCollection vs ReadonlyCollection 用于公开列表成员

如何判断对象是否已在 C# 中释放