4

我有以下 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# 调用此函数?

谢谢

4

2 回答 2

1

使用P/Invoke

于 2009-06-24T22:03:23.560 回答
1

您需要知道您在 c++ 函数中分配非托管内存块,因此无法从 C# 代码传递托管 String 或 Array 对象来“保存”char 数组。

一种方法是在您的本机 dll 中定义“删除”函数并调用它来释放内存。在托管方面,您可以使用IntPtr结构来临时保存指向 c++ char 数组的指针。

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

}

于 2009-06-24T23:22:53.650 回答