3

我有一个 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 和 string s,则此函数调用有效。

4

1 回答 1

4

对于这种类型的场景,不要直接使用字符串。而是将类型切换为 IntPtr 值并酌情使用 Marshal.PtrToStringAuto/Ansi/Uni。在这种情况下,由于您的本机代码使用char*,因此 PtrToStringAnsi 是最佳选择。

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
于 2009-08-03T17:54:34.030 回答