在c#中使用cpp代码(返回自定义struct和std:string)

时间:2014-10-23 07:45:33

标签: c# c++ wrapper

我试图构建一个包装器来在c#代码中使用cpp代码,我想返回自定义struct(Class)作为method2的输出,并返回std :: string for method1,这是我的代码CPP

extern "C" __declspec(dllexport)  std::string method1()
{
  std::string s;
  //Some Code/////////
  return s;
}

这是应该返回自定义struct(或类)

的方法
extern "C" __declspec(dllexport)  MyStruct method2()
{
  MyStruct s;
  //Some Code//////
  return s;
}

我尝试为这两种方法编写c#代码,这是我的c#代码

[DllImport("<dllPath>", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string  method1(); //Exception

[DllImport("<DllPath>")]
public static extern MyStruct method2(); //Compile Error

现在,当我尝试运行c#代码时,我得到方法1的MarshalDirectiveException,并为method2编译错误?

1 个答案:

答案 0 :(得分:1)

在第一个PInvoke中,C ++方法应返回const char *(s.c​​_str())。你应该删除“[return [...]]”并用IntPtr替换字符串。然后,您可以使用Marshal.PtrToStringAnsi(ptr)将IntPtr转换为字符串。 http://msdn.microsoft.com/en-US/library/s9ts558h(v=vs.110).aspx可以帮助您。

在第二个PInvoke中,您应该在C#中定义MyStruct(但我不能更精确,因为我没有关于MyStruct的信息)。此链接可以帮助您:http://www.codeproject.com/Articles/66243/Marshaling-with-C-Chapter-Marshaling-Compound-Ty

编辑:感谢hvd的评论,有时使用BSTR会更好,因为使用char *会很危险!