我正在开发一个从安装程序包中提取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但没有任何效果。
答案 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
。您需要致电LoadLibraryEx
并LOAD_LIBRARY_AS_DATAFILE
。