我有一个要从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/

10-12 02:55