如何从C#调用此本机方法

时间:2010-11-03 23:00:15

标签: c# c++ interop

我想调用本机库的一个/多个函数,但我不确定类型映射。我正在尝试的功能如下,这是我正在寻找的小型控制台应用程序:

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

安德鲁

3 个答案:

答案 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属性标记方法参数来实现。查看这篇文章,

MSDN

答案 2 :(得分:0)

你必须固定你的ptr1。

GCHandle handle = GCHandle.Alloc(ptr1, GCHandleType.Pinned);