2009-05-08 14 views
1

私はC++構造を持っており、私はC#コードからそれを相互運用する必要があります。Interopの問題 - 異なるOSアーキテクチャのための異なるC#構造

私はCを配布するのに対し、私は違っ異なるため++、(問題ではない32ビットまたは64bit--)私は異なるプラットフォームで同じC#のDLLを使用することができることを意味し、プラットフォームに依存しないDLL、として私のC#コードをコンパイルしますプラットフォーム。

問題は、相互運用が必要なC++構造体が、異なるC#定義で動作するように見えることです。

[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ビットOSには、次のような構造では動作します:64ビットOSでは、次のような構造では動作します

[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; 
    } 

は、実行時に構造体メンバのタイプを設定するにはとにかくはありますか?私はそれを行うためにダックの種類を入力する必要があることを知っているが、おそらくよりよい解決策があります...任意のアイデアですか?

答えて

2

IntPtrhLock)は機能しますか?そうでなければ、おそらくあなたのソースの定義...の#if使用する必要があります - すなわち

#if X86 
    .. 
#else 
    .. 
#endif 

とあなたの32ビットビルドでX86シンボルを定義(内蔵何もありません)

+0

前述のように、私はC#コードの2つのバージョンをコンパイルしたくないので、#if #endifは好ましくありません。 – Graviton

+0

私はあなたがIntPtr(#ifを必要としない)の最初の提案を逃したと思う。 – marklam

+0

ああ、最初の解決策(UInt64をIntPtrに変える)はうまくいく – Graviton

関連する問題