C#DllImport和Marshaling char **

我在c#中工作,我需要在c ++ dll中使用这个函数:

extern "C" char IMPEXP __stdcall service_GetParameter ( const char* parameter, const int value_lenght, char** value ); 

我在c ++代码中使用它如下:

 char *val = new char[256]; service_GetParameter("firmware_version", 255, &val); AnsiString FirmwareVersion = val; delete[] val; 

如何导入此函数并在c#中使用它?

提前致谢

如果此函数分配内存并使调用者负责释放它,我担心你必须手动管理它:将参数声明为ref IntPtr并使用Marshal类的方法获取带有副本的字符串有针对性的数据。

然后调用相应的函数来释放内存(正如Dirk所说,如果没有关于函数的更多信息,我们就不能多说这个)。

如果它确实必须在调用之前分配,它应该是这样的东西:

 [DllImport("yourfile.dll", CharSet = CharSet.Ansi)] public static extern sbyte service_GetParameter ( String parameter, Int32 length, ref IntPtr val); public static string ServiceGetParameter(string parameter, int maxLength) { string ret = null; IntPtr buf = Marshal.AllocCoTaskMem(maxLength+1); try { Marshal.WriteByte(buf, maxLength, 0); //Ensure there will be a null byte after call IntPtr buf2 = buf; service_GetParameter(parameter, maxLength, ref buf2); System.Diagnostics.Debug.Assert(buf == buf2, "The C++ function modified the pointer, it wasn't supposed to do that!"); ret = Marshal.PtrToStringAnsi(buf); } finally { Marshal.FreeCoTaskMem(buf); } return ret; } 

我会从这样的事情开始:

 [DllImport("yourfile.dll", CharSet = CharSet.Ansi] public static extern Int32 service_GetParameter([MarshalAs(UnmanagedType.LPStr)] String szParameter, Int32 value_length, [Out] StringBuilder sbValue);