2017-08-10 94 views
1

我試圖從C#UWP應用程序的非託管dll調用方法。我這樣做,但禁止在非託管dll上的「LoadLibrary()」,以便我可以使用它。使用從UWP C#應用程序撥動調用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裝載庫:

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

不幸的是,如果我添加 「ExactSpelling =真」,如下:

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

然後調用它拋出一個異常:

System.EntryPointNotFoundEx ception:'無法在DLL'kernel32'中找到名爲'LoadLibrary'的入口點。'

任何幫助非常感謝!

+1

事實上,有一個名爲'LoadLibrary'在'kernel32.dll'沒有入口點。還有兩個:用於ANSI字符串的'LoadLibraryA'和用於Unicode字符串的'LoadLibraryW'。你想要後者。儘管如此,不保證它可以工作。從我收集你應該在UW​​P上使用['LoadPackagedLibrary'](https://msdn.microsoft.com/library/windows/desktop/hh447159)(但我不是UWP開發人員)。 –

+0

LoadLibraryW()在UWP應用程序中是* verboten *。您無法通過應用認證,也無法通過商店進行銷售和部署。 –

+0

你確定嗎?我可以通過[DllImport(「API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL」,SetLastError = true)]導入來加載LoadLibraryW。 – TheJeff

回答

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); 
+0

消息:類初始化方法Tests.UnitTests.InitializeClient拋出異常。 System.EntryPointNotFoundException:System.EntryPointNotFoundException:無法找到名爲切入點在DLL 'API-MS-WIN-CORE-LIBRARYLOADER-L2-1-0.DLL' .. 'LoadLibraryPackaged' – TheJeff

+0

對不起,我犯了一個錯字。現在修復。 – Sunius