首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LoadLibrary编译为AnyCpu时不起作用

LoadLibrary编译为AnyCpu时不起作用
EN

Stack Overflow用户
提问于 2013-06-17 11:15:54
回答 1查看 4K关注 0票数 1

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

要做到这一点,我正在使用LoadLibrary。这是pinvoke C#签名。

代码语言:javascript
复制
 [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
 internal static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);

当将项目编译为x86时,上面的代码工作得很好,但是如果我将它编译成anycpu,它会失败,最后一个win32错误是:

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

我尝试在字符串中使用IntPtr,也尝试使用不同的字符集,但没有起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17146185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档