残念ながら、私はこの特定の DLL について何も知りません。ただし、P/Invoke を自分で実行し、多少の重複に対処できる場合は、プラットフォームごとに 1 つのプロキシを作成することができます。
たとえば、32 ビットまたは 64 ビットの DLL で実装する必要がある次のインターフェイスがあるとします。
public interface ICodec {
int Decode(IntPtr input, IntPtr output, long inputLength);
}
プロキシを作成します。
public class CodecX86 : ICodec {
private const string dllFileName = @"Codec.x86.dll";
[DllImport(dllFileName)]
static extern int decode(IntPtr input, IntPtr output, long inputLength);
public int Decode(IntPtr input, IntPtr output, long inputLength) {
return decode(input, output, inputLength);
}
}
と
public class CodecX64 : ICodec {
private const string dllFileName = @"Codec.x64.dll";
[DllImport(dllFileName)]
static extern int decode(IntPtr input, IntPtr output, long inputLength);
public int Decode(IntPtr input, IntPtr output, long inputLength) {
return decode(input, output, inputLength);
}
}
最後に、適切なものを選択するファクトリを作成します。
public class CodecFactory {
ICodec instance = null;
public ICodec GetCodec() {
if (instance == null) {
if (IntPtr.Size == 4) {
instance = new CodecX86();
} else if (IntPtr.Size == 8) {
instance = new CodecX64();
} else {
throw new NotSupportedException("Unknown platform");
}
}
return instance;
}
}
DLL は最初に呼び出されたときに遅延ロードされるため、各プラットフォームがネイティブのバージョンしかロードできないにもかかわらず、これは実際に機能します。詳細な説明については、この記事を参照してください。