我有一个要从DLL导入的方法,它的签名为:
BOOL GetDriveLetter(OUT char* DriveLetter)
我试过了
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter(byte[] DriveLetter);
和
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter(StringBuilder DriveLetter);
但在DriveLetter变量中均未返回任何内容。
最佳答案
似乎函数GetDriveLetter
所期望的char*
指向足够的内存来包含驱动器号。
我认为解决此问题的最简单方法是传递原始IntPtr
并将对GetDriveLetter
的调用包装在API中,该API负责资源管理以及将其转换为string
的工作。
[return:MarshalAsAttribute(UnmanagedType.Bool)]
private static extern bool GetDriveLetter(IntPtr ptr);
public static bool GetDriveLetter(out string drive) {
drive = null;
var ptr = Marshal.AllocHGlobal(10);
try {
var ret = GetDriveLetter(ptr);
if ( ret ) {
drive = Marshal.PtrToStringAnsi(ptr);
}
return ret;
} finally {
Marshal.FreeHGlobal(ptr);
}
}
关于c# - DllImport和char *,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2568436/