这里是情况,我在我的dot.net应用程序中使用基于C的dll。有2个DLL,一个是32位的叫MyDll32.dll,另一个是64位的叫MyDll64.dll的版本。在C#中使用32位或64位DLL DllImport
存在一个包含DLL文件名的静态变量:string DLL_FILE_NAME。
,它是在使用方式如下:
[DllImport(DLL_FILE_NAME, CallingConvention=CallingConvention.Cdecl, EntryPoint=Func1")]
private static extern int is_Func1(int var1, int var2);
简单为止。
您可以想象,该软件是在“Any 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 ?
64位和32位dll的区别是什么?有没有什么32位不能在64?如果是这样,我只会使用32。 –
在64位操作系统上,决定执行纯64位还是WOW64(32位仿真)时的代码。如果程序以32位模式执行,它应该使用基于C的dll,这些dll相应地编译为32位和64位。 – Gilad
如果你真的想这样做,你需要完全绕过'DllImport'属性,并手动使用'LoadLibrary','GetProcAddess'和'FreeLibrary'函数来加载DLL。该技术在[这里]讨论(http://stackoverflow.com/questions/2818011/set-dllimport-attribute-dynamically)。尽管这是一个相当的工作,而且很容易出错。让P/Invoke机制为你做这件事更容易。正如其他人所指出的,如果你可以一直回到32位DLL作为最低公分母,那么可能不值得。 –