私は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;
}
は、実行時に構造体メンバのタイプを設定するにはとにかくはありますか?私はそれを行うためにダックの種類を入力する必要があることを知っているが、おそらくよりよい解決策があります...任意のアイデアですか?
前述のように、私はC#コードの2つのバージョンをコンパイルしたくないので、#if #endifは好ましくありません。 – Graviton
私はあなたがIntPtr(#ifを必要としない)の最初の提案を逃したと思う。 – marklam
ああ、最初の解決策(UInt64をIntPtrに変える)はうまくいく – Graviton