c# - 使用其中的字符串编码结构时出现 PInvoke 错误

标签 c# c++ interop pinvoke marshalling

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

最佳答案

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

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}

关于c# - 使用其中的字符串编码结构时出现 PInvoke 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223690/

相关文章:

c# - Visual C# 和设置

c++ - VS2012 "Generating Code"大型硬编码数组速度慢

c++ - 了解 CStatic 和 CWnd 以及消息路由

c# - 从 C# 调用非托管 C++ 库 (dll) 会产生访问冲突错误 (0xc0000005)

c# - 使用多线程处理大型 Excel 文件

c# - 从代码中包含\", but it keeps it as\\\"的文件中读取文本

c# - 为什么我的 C# winforms 应用程序中的第一个 HttpClient.PostAsync 调用非常慢?

c# - SharePoint 2013 - 如何以编程方式设置搜索结果 url?

c++ - 如何避免 PANTHEIOS_FE_PROCESS_IDENTITY 的多重定义?

c# - 如何使用 WCHAR* 在消息框中显示来自 C# 的 C 函数