C# 如何在C中创建具有动态属性和属性的结构#
在我的应用程序中,需要使用p/Unjk将绝对的任意对象/Stutts传递到C++函数中。根据Internet,任何对象都可以作为C++结构传递(它们在调用期间被钉扎到特定的内存位置)。因为我只对数据感兴趣,不打算调用任何方法,所以这非常符合我的需要。但是,实验表明,这些对象必须具有C# 如何在C中创建具有动态属性和属性的结构#,c#,c++,reflection,pinvoke,C#,C++,Reflection,Pinvoke,在我的应用程序中,需要使用p/Unjk将绝对的任意对象/Stutts传递到C++函数中。根据Internet,任何对象都可以作为C++结构传递(它们在调用期间被钉扎到特定的内存位置)。因为我只对数据感兴趣,不打算调用任何方法,所以这非常符合我的需要。但是,实验表明,这些对象必须具有[StructLayout(LayoutKind.Sequential)]属性,否则代码将无法编译。不幸的是,这些类是由其他开发人员创建的,不能保证具有此属性 要解决此问题,一种解决方案是将一个对象传递给一个特殊的C#
[StructLayout(LayoutKind.Sequential)]
属性,否则代码将无法编译。不幸的是,这些类是由其他开发人员创建的,不能保证具有此属性
要解决此问题,一种解决方案是将一个对象传递给一个特殊的C#包装器函数,该函数将:
Type.GetProperties
[StructLayout(LayoutKind.Sequential)]
属性由于我是C#新手,我不确定如何动态创建具有任意属性和属性的结构。到目前为止,我发现的是和,但需要创建一个以前没有在任何地方定义过的动态结构,甚至没有作为通用对象定义过。有什么想法吗?像这样的东西对你有用吗
[StructLayout(LayoutKind.Sequential)]
struct MyStruct
{
public int Size;
public IntPtr PtrToArrayOfMetadata;
public IntPtr PtrToArrayOfObjects;
}
public enum Type
{
Int,
Float,
Decimal
}
然后发送一个“动态”对象
那么,我仍然能够使用P/Unjk将这样的结构传递给C++吗?不幸的是,这不是我的专长领域。但我想你可以。然而,必须确保结构的布局是您期望的C++中的布局。难道不可能为您的数据创建某种包装器吗?问题是我事先不知道它是什么数据。它可以是具有任何属性的任何对象。我的任务是将这些信息序列化为我能传递给C++的东西以及它描述的元数据(这样就不仅仅是C侧的数据块)。你根本不知道它能包含什么样的数据?我知道它可能包含int,浮点,双倍,长,字符串,其他对象或结构等。它也可能包含方法定义,但我对这些不感兴趣。必须考虑自定义getter/setter,并在将数据传递到本机代码之前执行自定义getter/setter来检索数据。您可以在非托管端使用
VARIANT
,在托管端使用object
。没有必要重新实施任何东西。
Type[] metadata = new Type[2];
metadata[0] = Type.Int;
metadata[1] = Type.Float;
object[] obj = new object[2];
obj[0] = 2;
obj[1]= 1;
GCHandle objHandle = GCHandle.Alloc(obj, GCHandleType.WeakTrackResurrection);
IntPtr ptrObj = GCHandle.ToIntPtr(objHandle);
objHandle = GCHandle.Alloc(metadata, GCHandleType.WeakTrackResurrection);
IntPtr ptrMeta = GCHandle.ToIntPtr(objHandle);
MyStruct tmp = new MyStruct();
tmp.Size = 2;
tmp.PtrToArrayOfMetadata = ptrMeta;
tmp.PtrToArrayOfObjects = ptrObj;