使用UWP C#应用程序中的pinvoke调用LoadLibrary

时间:2017-08-10 18:07:12

标签: c# uwp pinvoke

我正在尝试从C#UWP应用程序中调用非托管dll中的方法。我这样做,但在非托管dll上使用“LoadLibrary()”,以便我可以使用它。

这在调试模式下工作正常,但在发布模式下,我收到一个奇怪的错误:

消息:类初始化方法Tests.UnitTests.InitializeClient引发异常。 System.TypeLoadException:System.TypeLoadException:程序集'Client,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'中未解析的P / Invoke方法'LoadLibrary!kernel32',因为它在UWP应用程序中不可用。请使用另一个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'的入口点。'

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

改为使用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);