相关疑难解决方法(0)

在C#DllImport中使用32位或64位dll

这是情况,我在我的dot.net应用程序中使用基于C的dll.有2个dll,一个是32位称为MyDll32.dll,另一个是64位版本,名为MyDll64.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);
Run Code Online (Sandbox Code Playgroud)

到目前为止简单.

可以想象,该软件是在打开"Any CPU"的情况下编译的.

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

#if WIN64
        public const string DLL_FILE_NAME = "MyDll64.dll";
#else
        public const string DLL_FILE_NAME = "MyDll32.dll";        
#endif
Run Code Online (Sandbox Code Playgroud)

到目前为止,您应该看到问题.. DLL_FILE_NAME是在编译时定义的,而不是在执行时间中定义的,因此根据执行上下文不会加载右dll.

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

.net c# pinvoke dllimport 32bit-64bit

59
推荐指数
4
解决办法
5万
查看次数

动态设置DllImport属性

我正在使用PInvoke和DllImport属性使用外部非托管DLL.例如.

[DllImport("mcs_apiD.dll", CharSet = CharSet.Auto)]
private static extern byte start_api(byte pid, byte stat, byte dbg, byte ka);
Run Code Online (Sandbox Code Playgroud)

我想知道是否有可能以某种方式动态地更改dll文件详细信息(在此示例中为mcs_apiD.dll),例如,如果我想针对另一个dll版本构建

c# pinvoke

6
推荐指数
2
解决办法
7172
查看次数

目标 32 位或 64 位本机 DLL,具体取决于环境

我有一个 32 位和 64 位版本 (x86) 的本机 DLL。我想创建一个适用于两种架构(任何 CPU)的包装器,并根据当前环境(32 位或 64 位,运行时!)加载正确版本的 DLL。这个过程应该自动发生,所以我的 DLL 的用户不需要针对特定​​的体系结构。

有没有关于如何做到这一点的最佳实践?任何可以指导我的例子?

我找到了一种可能的解决方案,它为每个架构使用托管代理,然后使用该Assembly.Resolve事件加载正确的版本。但是,这要求我除了 2 个非托管库之外还有 3 个托管程序集,这似乎有点过头了。

还有其他解决方案吗?

.net c# dll pinvoke

4
推荐指数
2
解决办法
2946
查看次数

标签 统计

c# ×3

pinvoke ×3

.net ×2

32bit-64bit ×1

dll ×1

dllimport ×1