2009-05-08 13 views
1

Ich habe eine C++ - Struktur, und ich muss es von meinem C# -Code interop.Interop-Problem - Verschiedene C# -Struktur für verschiedene OS-Architektur

ich mein C# -Code als Plattform Agnostiker dll kompilieren, was bedeutet, dass ich die gleiche C# dll auf verschiedenen Plattformen verwenden können (32bit oder 64bit-- nicht egal), während ich die C++ unterschiedlich für verschiedene verteilen Plattformen.

Das Problem ist, dass die C++ - Struktur, die ich interop muss für unterschiedliche C# Definition funktioniert. In 64-Bit-OS arbeitet die folgende Struktur:

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

aber in 32-Bit-Betriebssystem, die folgende Struktur funktioniert:

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

Gibt es trotzdem, das Strukturelement des Typs zur Laufzeit festgelegt? Ich weiß, ich brauche eine Art Ente, um das zu tun, aber vielleicht gibt es eine bessere Lösung ... irgendwelche Ideen?

Antwort

2

Würde IntPtr (für hLock) funktionieren? Andernfalls werden Sie wahrscheinlich #if Definitionen in Ihrer Quelle verwenden ... - dh

#if X86 
    .. 
#else 
    .. 
#endif 

und definieren das X86 Symbol in der 32-Bit-Builds (es ist alles nicht eingebaut)

+0

Wie bereits erwähnt, möchte ich keine 2 Versionen meines C# -Codes kompilieren, daher wird das #If #endif nicht bevorzugt. – Graviton

+0

Ich glaube, Sie haben den ersten Vorschlag über die Verwendung eines IntPtr verpasst (die kein #if erfordert) – marklam

+0

Ah, Ihre erste Lösung (Ändern von UInt64 zu IntPtr) funktioniert – Graviton

Verwandte Themen