char** DllImport 失败
char** DllImport fails
我想Dll导入以下函数。尽管如此,"ret" returns 是正确的,但是我的字符串数组似乎是空的,所以我想我可能需要一些封送处理。欢迎任何提示!提前致谢:)
C函数:
bool getBootLog(char **a1);
以下代码用于测试,无法正常运行。
Dll导入:
[DllImport("ext.dll")]
public static extern bool getBootLog(string[] bootLog);
当前代码:
string[] bootLog = new string[1024 * 1024];
bool ret = getBootLog(bootLog);
foreach (string s in bootLog)
{
Debug.WriteLine(s);
}
2 次尝试无效:
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
try
{
getBootLog(out ptr);
var deref1 = (string)Marshal.PtrToStringAnsi(ptr);
Debug.WriteLine(deref1);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
var ptr2 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
try
{
getBootLog(out ptr2);
var deref1 = (IntPtr)Marshal.PtrToStructure(ptr2, typeof(IntPtr));
var deref2 = (string[])Marshal.PtrToStructure(deref1, typeof(string[]));
Debug.WriteLine(deref2);
}
finally
{
Marshal.FreeHGlobal(ptr2);
}
莫森的点子:
[DllImport("Ext.dll")]
public static extern bool getBootLog(StringBuilder bootLog);
try
{
int bufferSize = 50;
StringBuilder bootLog = new StringBuilder(" ", bufferSize);
Debug.WriteLine("Prepared bootLog...");
getBootLog(bootLog);
Debug.WriteLine("Bootlog length: " + bootLog.Length);
string realString = bootLog.ToString();
Debug.WriteLine("Bootlog: " + realString);
}
catch(Exception ex)
{
Debug.WriteLine("Xception: " + ex.ToString());
}
结果:
Prepared bootLog... Bootlog length: 0 Bootlog:
修改声明:
[DllImport("ext.dll", CharSet = CharSet.Ansi)]
public static extern bool getBootLog(ref IntPtr bootLogPtr);
代码的编辑版本中尝试的行看起来不正确。
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
真的,应该指定缓冲区的大小。
var ptr = Marshal.AllocHGlobal(100); // Set it to 100 bytes, maximum!
将长度写入 ptr
,作为其 C 风格的空终止字符串。
Marshal.WriteByte(ptr, 100, 0);
然后调用我脑海中的调用:
IntPtr ptrBuf = ptr;
getBootLog(ref ptrBuf);
将ptrBuf
缓冲区的内容复制到字符串变量中:
string sBootLog = Marshal.PtrToStringAnsi(ptrBuf);
清理非托管内存内容:
Marshal.FreeHGlobal(ptr);
我想Dll导入以下函数。尽管如此,"ret" returns 是正确的,但是我的字符串数组似乎是空的,所以我想我可能需要一些封送处理。欢迎任何提示!提前致谢:)
C函数:
bool getBootLog(char **a1);
以下代码用于测试,无法正常运行。
Dll导入:
[DllImport("ext.dll")]
public static extern bool getBootLog(string[] bootLog);
当前代码:
string[] bootLog = new string[1024 * 1024];
bool ret = getBootLog(bootLog);
foreach (string s in bootLog)
{
Debug.WriteLine(s);
}
2 次尝试无效:
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
try
{
getBootLog(out ptr);
var deref1 = (string)Marshal.PtrToStringAnsi(ptr);
Debug.WriteLine(deref1);
}
finally
{
Marshal.FreeHGlobal(ptr);
}
var ptr2 = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
try
{
getBootLog(out ptr2);
var deref1 = (IntPtr)Marshal.PtrToStructure(ptr2, typeof(IntPtr));
var deref2 = (string[])Marshal.PtrToStructure(deref1, typeof(string[]));
Debug.WriteLine(deref2);
}
finally
{
Marshal.FreeHGlobal(ptr2);
}
莫森的点子:
[DllImport("Ext.dll")]
public static extern bool getBootLog(StringBuilder bootLog);
try
{
int bufferSize = 50;
StringBuilder bootLog = new StringBuilder(" ", bufferSize);
Debug.WriteLine("Prepared bootLog...");
getBootLog(bootLog);
Debug.WriteLine("Bootlog length: " + bootLog.Length);
string realString = bootLog.ToString();
Debug.WriteLine("Bootlog: " + realString);
}
catch(Exception ex)
{
Debug.WriteLine("Xception: " + ex.ToString());
}
结果:
Prepared bootLog... Bootlog length: 0 Bootlog:
修改声明:
[DllImport("ext.dll", CharSet = CharSet.Ansi)]
public static extern bool getBootLog(ref IntPtr bootLogPtr);
代码的编辑版本中尝试的行看起来不正确。
var ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));
真的,应该指定缓冲区的大小。
var ptr = Marshal.AllocHGlobal(100); // Set it to 100 bytes, maximum!
将长度写入 ptr
,作为其 C 风格的空终止字符串。
Marshal.WriteByte(ptr, 100, 0);
然后调用我脑海中的调用:
IntPtr ptrBuf = ptr;
getBootLog(ref ptrBuf);
将ptrBuf
缓冲区的内容复制到字符串变量中:
string sBootLog = Marshal.PtrToStringAnsi(ptrBuf);
清理非托管内存内容:
Marshal.FreeHGlobal(ptr);