互操作问题 - 不同操作系统架构的不同C#结构

时间:2009-05-08 07:49:12

标签: .net interop

我有一个C ++结构,我必须从我的C#代码中互操作。

我将我的C#代码编译为平台无关的dll,这意味着我可以在不同的平台上使用相同的C#dll( 32位或64位 - 无所谓),而我分发不同平台的C ++不同。

问题是我必须互操作的C ++结构似乎适用于不同的C#定义。在64位操作系统中,以下结构有效:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MayDay_CONTEXT
    {
        public System.UInt32  dwIndex;      //previously was int
        public System.UInt32 dwVersion;     //previously was int        
        public System.UInt64 hLock;         //previously was int
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
        public byte[] reserve;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
        public byte[] bAtr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] bID;
        public uint dwAtrLen;
    } 

但在32位操作系统中,以下结构有效:

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct MayDay_CONTEXT
    {
        public int  dwIndex;        //previously was int
        public int dwVersion;       //previously was int        
        public int hLock;           //previously was int
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
        public byte[] reserve;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
        public byte[] bAtr;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] bID;
        public uint dwAtrLen;
    }

无论如何在运行时设置结构成员的类型?我知道我需要一种鸭子打字来做这件事,但也许有更好的解决方案......任何想法?

1 个答案:

答案 0 :(得分:2)

IntPtrhLock)会有效吗?否则,您可能不得不在源代码中使用#if定义...... - 即

#if X86
     ..
#else
     ..
#endif

并在32位版本中定义X86符号(内置任何内容)

相关问题