我正在开发一个从安装包中提取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,也尝试使用不同的字符集,但没有起作用。
发布于 2013-06-17 11:29:41
LoadLibrary工作得很好。问题是,您正在尝试将32位DLL加载到64位进程中。这是无法完成的,您引用的错误消息是试图将模块与不匹配的bitness混合的结果。
问题不在于LoadLibrary的p/invoke签名,而在于问题中未显示的对LoadLibrary的调用。该调用导致尝试将32位DLL加载到64位进程中。除非您有64位版本的所有加载的本机‘ll,否则您将需要坚持使用x86。
顺便说一句,对这个函数使用CharSet.Ansi是没有意义的。由于.net本机使用UTF-16文本,您最好使用CharSet.Unicode,避免任何字符集转换,并确保您的程序能够支持Unicode文件名。
更新
在注释中,您将询问是否可以从64位进程加载32位DLL,以便提取资源。这是可能的,但不是用LoadLibrary。您需要调用LoadLibraryEx传递LOAD_LIBRARY_AS_DATAFILE。
https://stackoverflow.com/questions/17146185
复制相似问题