Вызов неуправляемого кода из C#. Получение данных с использованием IntPtr
У меня странная проблема с приложением, которое я сейчас пишу. Я почти уверен, что недавно ничего не изменил в приведенном ниже коде, но почему-то он перестал работать. К точке. Я использую:
[DllImport("NetApi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern uint NetShareGetInfo(
string servername,
string netname,
int level,
out IntPtr ppBuf
);
Импортировать NetApi32.dll. Мне нужен физический Путь. WMI и WinRM не могут быть использованы. Тогда у меня есть enum и struct, как показано ниже:
public enum ShType
{
DiskTree = 0,
PrintQ = 1,
Device = 2,
IPC = 3,
Temporary = 0x40000000,
Special = unchecked((int)0x80000000)
}
public struct SHARE_INFO_502
{
public string Name;
public ShType Type;
public string Remark;
public int Permissions;
public int MaxUses;
public int CurrentUses;
public string Path;
public string PassWd;
public int reserved;
public IntPtr SecDescriptor;
}
все в
[SuppressUnmanagedCodeSecurity]
public static class SafeNativeMethods
Класс согласно анализатору кода VS. Я называю это с:
IntPtr ptrGet;
var resGetInfo = SafeNativeMethods.NetShareGetInfo("server_name", "share_name", 502, out ptrGet);
SafeNativeMethods.SHARE_INFO_502 siGet = (SafeNativeMethods.SHARE_INFO_502)Marshal.PtrToStructure(ptrGet, typeof(SafeNativeMethods.SHARE_INFO_502));
после выполнения кода выше я не получаю никаких ошибок или исключений, однако siGet Struct имеет только первую букву каждого значения свойства. Где может быть проблема?
1 ответ
Набор символов по умолчанию Ansi
и это то, что использует структура маршаллинга. Но вы выбираете версию функции Unicode. Вы также должны указать набор символов для структуры:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SHARE_INFO_502
....
Несколько советов по составлению текста:
- Всякий раз, когда вы видите только первый символ строки, вы должны сначала подозревать, что текст UTF-16 интерпретируется как ANSI или UTF-8.
- Всякий раз, когда вы видите текст, который выглядит по-китайски там, где вы ожидали английский, вы должны сначала подозревать, что у вас есть текст ANSI или UTF-8, интерпретируемый как UTF-16.