C ++ idl修复长度数组在C#tlb中编组为变量数组 [英] C++ idl fix length array Marshaling as variable array in C# tlb
本文介绍了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屋!
查看全文