2016-12-01 64 views
3

我試圖調用LoadLibrary方法,但它返回0. Marshal.GetLastWin32Error正在返回126(指定的模塊找不到)。爲什麼LoadLibrary不能使用給定的路徑?

代碼:

[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)] 
static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName); 

string path = @"C:\junk\測試\BlueStacksKK_DeployTool_2.5.48.7209_china_gmgr\ProgramFiles\BstkC.dll"; 
IntPtr ptr = LoadLibrary(path); 
int error = Marshal.GetLastWin32Error(); 

,但如果我這個文件移動到其他位置一樣C:\Test\BstkC.dll,它工作正常。

問題可能是由於路徑中的測試。所以如果我們用英語以外的其他語言進行搜索,它將如何工作。

僅供參考。 File.Exists(path)返回true。

回答

0

嘗試:

[DllImport("kernel32", SetLastError = true] 
static extern IntPtr LoadLibraryW([MarshalAs(UnmanagedType.LPWStr)]string lpFileName); 

基礎Win32 API帶有兩種形式:ASCII模式(其允許在串僅ASCII字符)和Unicode模式(其允許在字符串UTF16字符)。你需要明確地告訴CLR你想要Unicode風格的函數(LoadLibraryW),並保留C#字符串的UTF16編碼(通過使用(使用UTF16字符串) LPWStr)。

+0

請注意,ASCII!= ANSI。 –

2

你必須設置用於爲Unicode字符集,因爲你在你的路徑中使用非Unicode字符:

[DllImport("kernel32", CharSet=CharSet.Unicode)] 
static extern IntPtr LoadLibrary(string lpFileName); 

現在只需要在LoadLibraryA(ANSI)的變體。見MSDN

+0

仍然不能正常工作,我之前也試過這個 –

+0

對不起,省略'LPStr'也是必需的。 –

相關問題