将 char*[] 从 c++ dll Struct 传递给 c#

Posted

技术标签:

【中文标题】将 char*[] 从 c++ dll Struct 传递给 c#【英文标题】:passing char*[] from c++ dll Struct to c# 【发布时间】:2012-09-24 08:44:01 【问题描述】:

我正在尝试通过 c++ DLL 将以下结构传递给 c#:

struct name 
   char* myArray[3];
    char firstname[100]; 
    char lastname[100]; 
; 

void Caller(struct name * demo) 

  strcpy(demo->firstname,"hello");
  demo->myArray[0]="hello";
  demo->myArray[1]="hello";
  demo->myArray[2]="hello";
  ping(demo);                     //call to c# function

下面是我的 c# 代码:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct name

   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
   public string firstname;
   [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
   public string lastname;

   //what should i marshal here for  char* myArray[3];
 ;

static void Main(string[] args)

   name myname = new name();
   ping( ref myname);


public static void ping(int a,ref name myname)

   Console.WriteLine(myname.firstname+"\n");

我可以从 c++ dll 中导入名字和姓氏。

从c++导入char指针数组怎么办?

【问题讨论】:

你试过 public string[] myArray; 是的尝试过...但是在以下行中出现错误 IntPtr c= myname.myArray; 您需要将其声明为 IntPtr[] 并在使用 new IntPtr[3] 调用函数之前对其进行初始化。然后使用 Marshal.PtrToStringAnsi() 转换字符串。不可阻挡的内存泄漏的可能性很高。 不确定,但您可以声明它:[MarshalAs(UnmanagedType.ByValArray,SizeConst=3)] string[] 【参考方案1】:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Name

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string FirstName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
    public string LastName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public string[] Array;
;

对于我的完整解决方案,请检查 Foo.cpp 和 Program.cs:https://gist.github.com/3779066

【讨论】:

以上是关于将 char*[] 从 c++ dll Struct 传递给 c#的主要内容,如果未能解决你的问题,请参考以下文章

调用从 c# 返回 char* 的 c++ dll 函数。无法使用 DllImport()

使用 DLL 将 C# StringBuilder / 字符串传递给 C++ char*

将 struct* 从 c# 传递到 c++ dll

将 c++ dll 的 char 指针数组传递给 c# 字符串

如何将带有 unsigned char* 的结构从 C# 传递到 C++?

C#从返回char指针的c++函数中获取字符串/字符值