从c#向c ++ dll发送带有动态数组字符串的struct

时间:2011-07-15 09:10:14

标签: c# c++ dll interop

我有一个定义为

的结构
struct DiskInfo{
int size,
char **atributes
};

我需要将它发送到运行类似

的c ++ dll
for(i=0;i<Files.count;i++)
{
   newList[i] = (wchar_t *)malloc(sizeof(List->Strings[i]));  
   wcscpy(newList[i], List->Strings[i]);
  .... more code
 }

此时我的结构poplutaed将所有数据,我需要将其发送回c#。 我试过了:

internal struct DiskInfo
    {
        internal int size;
        [MarshalAs(UnmanagedType.ByValArray)]
        internal string[] Files;
    }

,签名是

[DllImport("Disk.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = GetDiskInfo")]
    internal static extern uint GetDiskInfo(
       [In, Out] 
        DiskInfo Param);

并致电函数

 data= new DiskInfo();
 Native.GetDiskInfo(data);

但是,数据始终返回null。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

在C#中,DiskInfo是一个结构,这意味着它是一个值类型,并将通过复制传递给方法(除非使用了ref关键字)。所以C ++代码不可能修改原始结构,只修改副本。如果您使用ref关键字声明GetDiskInfo并且在方法调用中也使用了该关键字,那么您可能会更好运。