Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中创建具有动态属性和属性的结构#_C#_C++_Reflection_Pinvoke - Fatal编程技术网

C# 如何在C中创建具有动态属性和属性的结构#

C# 如何在C中创建具有动态属性和属性的结构#,c#,c++,reflection,pinvoke,C#,C++,Reflection,Pinvoke,在我的应用程序中,需要使用p/Unjk将绝对的任意对象/Stutts传递到C++函数中。根据Internet,任何对象都可以作为C++结构传递(它们在调用期间被钉扎到特定的内存位置)。因为我只对数据感兴趣,不打算调用任何方法,所以这非常符合我的需要。但是,实验表明,这些对象必须具有[StructLayout(LayoutKind.Sequential)]属性,否则代码将无法编译。不幸的是,这些类是由其他开发人员创建的,不能保证具有此属性 要解决此问题,一种解决方案是将一个对象传递给一个特殊的C#

在我的应用程序中,需要使用p/Unjk将绝对的任意对象/Stutts传递到C++函数中。根据Internet,任何对象都可以作为C++结构传递(它们在调用期间被钉扎到特定的内存位置)。因为我只对数据感兴趣,不打算调用任何方法,所以这非常符合我的需要。但是,实验表明,这些对象必须具有
[StructLayout(LayoutKind.Sequential)]
属性,否则代码将无法编译。不幸的是,这些类是由其他开发人员创建的,不能保证具有此属性

要解决此问题,一种解决方案是将一个对象传递给一个特殊的C#包装器函数,该函数将:

  • 使用
    Type.GetProperties
  • 动态创建具有必要属性的结构,并从对象复制值
  • 添加
    [StructLayout(LayoutKind.Sequential)]
    属性
  • 将该结构与C++在步骤1中检索的元数据一起传递(以便C++知道对象结构和如何读取它)

  • 由于我是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;