C ++ idl修复长度数组在C#tlb中编组为变量数组 [英] C++ idl fix length array Marshaling as variable array in C# tlb

查看:97
本文介绍了C ++ idl修复长度数组在C#tlb中编组为变量数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是* .idl内容



 [ uuid  (C3BBAEE5-DC4A-  4873  -963B-EFDAC87FC443)] 
typedef enum
{
eVal1 = 1
eVal2 = 2
} EData1;


[ uuid (1B790A2A-9F6F-4F03-A54F-993B52D507A6)]
struct STData1
{
EData1 ed1;
float fValue [ 15 ];
}

[ uuid (AA612D65-AE0E-4C51-9A35-79A76FF20747)]
struct STData2
{
long long tTimeStamp;
struct STData1 tData [ 16 ];
};




$ C $ b在C#中引用包含这些结构的dll,但得到



 [Serializable] 
[SuppressUnmanagedCodeSecurity]
[Guid( AA612D65-AE0E-4C51-9A35-79A76FF20747)]
public struct STData2
{
public STData1 [] tData ;
public long tTimeStamp;
}



见上文,STData1不带长度16.请帮助。



提前感谢。

解决方案

看看数组的默认封送处理 [ MSDN上的^ ] - 你可以在底部尝试做一个例子:

 [Serializable] 
[SuppressUnmanagedCodeSecurity]
[Guid( AA612D65-AE0E-4C51-9A35-79A76FF20747)]
public struct STData2
{
public long tTimeStamp;
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 16 )]
public STData1 [] tData;
}



NB: C#结构中字段的顺序需要与C ++结构中字段的顺序相匹配


Below is the *.idl content

[uuid(C3BBAEE5-DC4A-4873-963B-EFDAC87FC443)]
typedef enum
{
eVal1 =1,
eVal2 =2
}EData1;


[uuid(1B790A2A-9F6F-4F03-A54F-993B52D507A6)]
struct STData1
{
      EData1     ed1;
      float      fValue[15];
}

[uuid(AA612D65-AE0E-4C51-9A35-79A76FF20747)]
struct STData2
{
   long long      tTimeStamp;
   struct STData1 tData[16];
};



in C# refering the dll containing these structures,But getting

[Serializable]
       [SuppressUnmanagedCodeSecurity]
       [Guid("AA612D65-AE0E-4C51-9A35-79A76FF20747")]
       public struct STData2
       {
           public STData1[] tData;
           public long tTimeStamp;
       }


See above, STData1 not carrying the length 16.Please help.

thanks in advance.

解决方案

Have a look at Default Marshaling for Arrays[^] on MSDN - there's an example of what you're trying to do at the bottom:

[Serializable]
[SuppressUnmanagedCodeSecurity]
[Guid("AA612D65-AE0E-4C51-9A35-79A76FF20747")]
public struct STData2
{
    public long tTimeStamp;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public STData1[] tData;
}


NB: The order of the fields in the C# structure needs to match the order of the fields in the C++ structure.


这篇关于C ++ idl修复长度数组在C#tlb中编组为变量数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆