我有一个C ++结构

struct UnmanagedStruct
{
   char* s;
   // Other members
};

和一个C#结构

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
   // Other members
}

的C ++库公开

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

和它导入等

  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

然而,当我调用这个函数,我得到

MarshalDirectiveException了未处理

方法的类型签名是不兼容的PInvoke

的事情是,如果我从结构取出的char * S和字符串s调用这个函数的工作。

有帮助吗?

解决方案

有关这种类型的场景,不直接使用一个字符串。代替切换到是一个IntPtr值,并使用Marshal.PtrToStringAuto / ANSI / UNI适当的类型。在这种情况下,由于本机代码使用char*,PtrToStringAnsi是最好的选择。

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top