Вызов функции C ++ из C # - PullRequest
4 голосов
/ 25 июня 2009

У меня есть следующая функция C ++

void FillAndReturnString(char ** someString)
{
   char sourceString[] = "test";
   *someString = new char[5];
   memcpy(*someString, sourceString, 5);   
}

Объявлен как

extern "C"
{
__declspec(dllexport) void __cdecl FillAndReturnString(char ** someString);
}

Как мне вызвать эту функцию из C #?

Спасибо

Ответы [ 2 ]

1 голос
/ 25 июня 2009

Вам нужно знать, что вы выделяете неуправляемый блок памяти в вашей функции c ++, поэтому невозможно будет передать управляемый объект String или Array из кода C # для «удержания» массива char.

Один из подходов состоит в том, чтобы определить функцию «Delete» в вашей родной dll и вызвать ее для освобождения памяти. На управляемой стороне вы можете использовать структуру IntPtr для временного хранения указателя на массив символов c ++.

// c++ function (modified)
void __cdecl FillAndReturnString(char ** someString)
{
   *someString = new char[5];
   strcpy_s(*someString, "test", 5);   // use safe strcpy
}

void __cdecl DeleteString(char* someString)
{
   delete[] someString
}


// c# class
using System;
using System.Runtime.InteropServices;

namespace Example
{
   public static class PInvoke
   {
      [DllImport("YourDllName.dll")]
      static extern public void FillAndReturnString(ref IntPtr ptr);

      [DllImport("YourDllName.dll")]
      static extern public void DeleteString(IntPtr ptr);
   }

   class Program
   {
      static void Main(string[] args)
      {
         IntPtr ptr = IntPtr.Zero;
         PInvoke.FillAndReturnString(ref ptr);

         String s = Marshal.PtrToStringAnsi(ptr);

         Console.WriteLine(s);

         PInvoke.Delete(ptr);
      }
   }

}

1 голос
/ 25 июня 2009
...