1

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

为此,我正在使用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 插入字符串,也尝试使用不同的字符集,但没有任何效果。

4

1 回答 1

3

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

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

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

更新

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

于 2013-06-17T11:29:41.750 回答