Как мне вызвать этот нативный метод из C # - PullRequest
2 голосов
/ 04 ноября 2010

Я хочу вызвать одну / многие функции нативной библиотеки, но я не уверен в отображении типов. В частности, в настоящее время я пытаюсь использовать следующую функцию: вот небольшое консольное приложение, в которое я добавляю:

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));
    }
}

ТИА

Andrew

Ответы [ 3 ]

2 голосов
/ 04 ноября 2010

Вам нужно передать IntPtr на ref, чтобы функция могла перезаписать его.Затем вам также необходимо освободить строку после того, как вы скопировали ее, надеюсь, DLL предоставляет соответствующую функцию освобождения.StringToCoTaskMemAnsi вам тоже ничего не помогает, это просто утечка памяти.

Правильное объявление p / invoke, вероятно,

[DllImport("termcap.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr tgetstr(string name, ref IntPtr area);
0 голосов
/ 04 ноября 2010

Вы должны закрепить свой ptr1.

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

0 голосов
/ 04 ноября 2010

Я не работал с неуправляемым кодом уже 3 года, но думаю, что вы можете сделать это, пометив параметры метода атрибутом MarshalAs.Проверьте эту статью,

MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...