不幸的是,我对这个特定的 DLL 一无所知。但是,当您自己执行 P/Invoke 时,您可以应对一些重复,可以为每个平台创建一个代理。
例如,假设您有以下接口,它应该由 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 在第一次被调用时被延迟加载,这实际上是有效的,尽管每个平台只能加载它的本机版本。有关更详细的说明,请参阅本文。