我想调用本机库的一个/多个函数,但我不确定类型映射。我正在尝试的功能如下,这是我正在寻找的小型控制台应用程序:
extern char *tgetstr (const char *name, char **area);
这是我尝试将其映射到.NET控制台中使用。 我收到错误消息,尝试读取或写入受保护的内存。
class Program
{
[DllImport("termcap.dll")]
public static extern IntPtr tgetstr(IntPtr name, IntPtr area);
static void Main(string[] args)
{
IntPtr ptr1 = new IntPtr();
IntPtr a = tgetstr(Marshal.StringToCoTaskMemAnsi("cl"), ptr1);
Console.WriteLine(Marshal.PtrToStringBSTR(a));
}
}
TIA
安德鲁
答案 0 :(得分:2)
您需要将IntPtr
传递给ref
,以便该功能可以覆盖它。然后你还需要在复制后释放字符串,希望DLL提供匹配的释放功能。 StringToCoTaskMemAnsi
也没有帮助你,只是泄漏记忆。
正确的p / invoke声明可能是
[DllImport("termcap.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr tgetstr(string name, ref IntPtr area);
答案 1 :(得分:0)
我从未使用过3年的非托管代码,但我认为你可以通过使用MarshalAs属性标记方法参数来实现。查看这篇文章,
答案 2 :(得分:0)
你必须固定你的ptr1。
GCHandle handle = GCHandle.Alloc(ptr1, GCHandleType.Pinned);