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