【发布时间】:2016-05-30 18:05:32
【问题描述】:
我想 DllImport 以下函数。尽管如此,“ret”返回真,但我的字符串数组似乎是空的,所以我想我可能需要一些封送处理。欢迎任何提示!在此先感谢:)
C 函数:
bool getBootLog(char **a1);
以下代码用于测试,不能正常工作。
DllImport:
[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());
}
结果:
已准备好 bootLog... Bootlog 长度:0 Bootlog:
【问题讨论】:
-
你能把问题说得更具体一点吗?
-
string[] 和 char** 的类型不一样。您需要通过 char** 调用 getBootLog。
-
这个函数很难从 C 程序中调用,当你 pinvoke 时它并没有变得更好。参数必须是
out IntPtr。接下来是盲目的猜测,但它必须从 Marshal.PtrToStringAnsi() 开始。您很可能会发生内存泄漏。 -
@iwein:我需要一种 C# 中的工作方式来调用 C 函数。上面显示的方式只是部分工作。
-
@metaDom 我要求您编辑问题以使其更清楚......
标签: c# char dllimport pointer-to-pointer