编译到 AnyCpu 时 LoadLibrary 不起作用

2024-01-09

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

来做我正在使用的加载库 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx。这是 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 而不是字符串,也尝试使用不同的字符集,但没有任何效果。


LoadLibrary工作正常。问题是您正在尝试将 32 位 DLL 加载到 64 位进程中。这是无法完成的,您引用的错误消息是尝试混合具有不匹配位数的模块的结果。

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

顺便说一句,使用确实没有意义CharSet.Ansi对于这个功能。由于 .net 本身使用 UTF-16 文本,因此最好使用CharSet.Unicode,避免任何字符集转换并确保您的程序可以支持 Unicode 文件名。

Update

在评论中,您询问是否可以从 64 位进程加载 32 位 DLL 以提取资源。这是可能的,但不可以LoadLibrary。你需要打电话LoadLibraryEx http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179.aspx通过LOAD_LIBRARY_AS_DATAFILE.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译到 AnyCpu 时 LoadLibrary 不起作用 的相关文章

随机推荐