2016-12-01 3 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

Try:

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

Базовый Win32 API поставляется с двумя вкусами: режим ASCII (который позволяет только символы ASCII в строках) и режим Unicode (что позволяет utf16 символов в строках).

С # UTF16 основе, в основном, вы запустили в ASCII-приправленный функцию с utf16 строки, вы должны явно указать CLR вы хотите ароматизированный функцию Unicode (LoadLibraryW) и сохранить UTF16 кодирование C# строки (с помощью LPWStr).

+0

Обратите внимание, что ASCII! = ANSI. –

2

Вы должны установить набор символов, используемый для Unicode, так как вы используете не-юникод символов в вашем пути:

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

Теперь он принимает (ANSI) вариант LoadLibraryA. См. MSDN.

+0

все еще не работает, я тоже пробовал это до –

+0

Извините, опустив 'LPStr' тоже требуется. –

Смежные вопросы