Вызов функции из обычной DLL из C # - проблема выделения памяти? - PullRequest
0 голосов
/ 18 ноября 2009

Привет, парни (и chappette)

Иметь обычную C dll с экспортированной функцией

int GetGroovyName (int grooovyId, char * pGroovyName, int bufSize,)

В основном вы передаете ему идентификатор (int), буфер char * с предварительно выделенной памятью и размер передаваемого буфера.

pGroovyName заполняется текстом. (т.е. это поиск на основе groovyID)

Вопрос в том, как мне лучше назвать это из c #?

ура

Гул

Ответы [ 3 ]

3 голосов
/ 18 ноября 2009

На стороне C # у вас будет:

[DllImport("MyLibrary")]
extern static int GetGroovyName(int grooovyId, StringBuilder pGroovyName, int bufSize);

И вы называете это как:

StringBuilder sb = new StringBuilder (256);
int result = GetGroovyName (id, sb, sb.Capacity); // sb.Capacity == 256
1 голос
/ 18 ноября 2009

Вы можете использовать DLLImport в C #.

Проверьте это http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

Код от MSDN

using System;
using System.Runtime.InteropServices;

class Example
{
    // Use DllImport to import the Win32 MessageBox function.
    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

    static void Main()
    {
        // Call the MessageBox function using platform invoke.
        MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
    }
}
0 голосов
/ 18 ноября 2009

Посмотрите на этот фрагмент, демонстрирующий (теоретически), как он должен выглядеть:

using System;
using System.Runtime.InteropServices;
using System.Text; // For StringBuilder

class Example
{
    [DllImport("mylib.dll", CharSet = CharSet.Unicode)]
    public static extern int GetGroovyName(int grooovyId, ref StringBuilder sbGroovyName,  int bufSize,)

    static void Main()
    {
        StringBuilder sbGroovyNm = new StringBuilder(256);
        int nStatus = GetGroovyName(1, ref sbGroovyNm, 256);
        if (nStatus == 0) Console.WriteLine("Got the name for id of 1. {0}", sbGroovyNm.ToString().Trim());
        else Console.WriteLine("Fail!");
    }
}

Я установил для строителя строки максимальную емкость 256, вы можете определить что-то меньшее, предполагая, что он возвращает 0 в случае успеха, он печатает строковое значение для groovy id, равного 1, в противном случае печать не удалась. Надеюсь это поможет. Том

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