将 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*
将 c++ dll 的 char 指针数组传递给 c# 字符串