编译到AnyCpu时,LoadLibrary不起作用

时间:2013-06-17 11:15:55

标签: c# pinvoke loadlibrary

我正在开发一个从安装程序包中提取cab文件的c#应用程序。

这样做我正在使用LoadLibrary。这是pinvoke C#签名。

 [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
 internal static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);

上面的代码在将项目编译为x86时工作正常,但是如果我将其编译为anycpu则失败,最后的win32错误是:

  

“%1不是有效的Win32应用程序”

我尝试使用IntPtr insted一个字符串,并使用dfferent charset但没有任何效果。

1 个答案:

答案 0 :(得分:2)

LoadLibrary运行正常。问题是您正在尝试将32位DLL加载到64位进程中。这是不可能的,您引用的错误消息是尝试混合具有不匹配位的模块的结果。

问题不在LoadLibrary的p / invoke签名中,而是问题中未显示的对LoadLibrary的调用。该调用导致尝试将32位DLL加载到64位进程中。除非您加载了所有本机DLL的64位版本,否则您需要坚持使用x86。

除此之外,使用CharSet.Ansi来实现此功能毫无意义。由于.net本身使用UTF-16文本,因此使用CharSet.Unicode会更好,避免任何字符集转换并确保您的程序可以支持Unicode文件名。

<强>更新

在评论中,您询问是否可以从64位进程加载32位DLL以提取资源。这是可能的,但不是LoadLibrary。您需要致电LoadLibraryExLOAD_LIBRARY_AS_DATAFILE