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?
Wie bereits erwähnt, möchte ich keine 2 Versionen meines C# -Codes kompilieren, daher wird das #If #endif nicht bevorzugt. – Graviton
Ich glaube, Sie haben den ersten Vorschlag über die Verwendung eines IntPtr verpasst (die kein #if erfordert) – marklam
Ah, Ihre erste Lösung (Ändern von UInt64 zu IntPtr) funktioniert – Graviton