从UWP C#应用程序使用PInvoke调用LoadLibrary

7

我正在尝试从C# UWP应用程序调用未托管的dll中的方法。为此,我会对未托管的dll进行引用,使用pinvoke中的“LoadLibrary()”。

在调试模式下,这一切都可以正常工作。然而,在发布模式下,我遇到了一个奇怪的错误:

消息: 类初始化方法Tests.UnitTests.InitializeClient抛出异常。System.TypeLoadException: System.TypeLoadException: 由于UWP应用程序不支持,“Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”程序集中未解析的P/Invoke方法“LoadLibrary!kernel32”。请使用另一个API或使用[DllImport(ExactSpelling=true)]来表明您理解使用非UWP应用程序API的含义。

这是我的pinvoke Load Library方法:

    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern IntPtr LoadLibrary(string librayName);

很抱歉,如果我添加“ExactSpelling=true”如下所示:

不幸的是:

    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
    public static extern IntPtr LoadLibrary(string librayName);

然后调用它将会抛出一个异常:

System.EntryPointNotFoundException:“无法在 DLL 'kernel32' 中找到名为 'LoadLibrary' 的入口点。”

非常感谢任何帮助!


4
确实,kernel32.dll 中没有名为 LoadLibrary 的入口点。但有两个其他的入口点:用于 ANSI 字符串的 LoadLibraryA 和用于 Unicode 字符串的 LoadLibraryW。你需要用后者。虽然不保证它能正常工作。根据我所了解的,如果你是 UWP 开发人员,应该使用 LoadPackagedLibrary - Jeroen Mostert
1
在 UWP 应用程序中,LoadLibraryW() 是被禁止的。您无法获得应用程序认证,也无法通过商店销售和部署。 - Hans Passant
你确定吗?我能够通过 [DllImport("API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL", SetLastError = true)] 导入成功加载 LoadLibraryW。 - TheJeff
1个回答

5
请使用LoadPackagedLibrary代替:
[DllImport("API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL", SetLastError = true)]
public static extern IntPtr LoadPackagedLibrary([MarshalAs(UnmanagedType.LPWStr)]string libraryName, int reserved = 0);

抱歉,我打错字了。已经修正了。 - Sunius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接