Thật không may, tôi không biết gì về DLL cụ thể này. Tuy nhiên, khi bạn thực hiện P/Gọi chính mình và bạn có thể đối phó với một chút trùng lặp, bạn có thể tạo một proxy cho mỗi nền tảng.
Ví dụ, giả sử rằng bạn đã giao diện sau đây, mà cần được thực hiện bởi một trong hai một 32 hoặc 64 bit DLL:
public interface ICodec {
int Decode(IntPtr input, IntPtr output, long inputLength);
}
Bạn tạo các proxy:
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);
}
}
và
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);
}
}
Và cuối cùng là tạo một nhà máy chọn đúng nhà máy cho bạn:
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;
}
}
Khi các tệp DLL được tải lazily lần đầu tiên chúng được gọi, điều này thực sự hoạt động, mặc dù mỗi nền tảng chỉ có thể tải phiên bản gốc. Xem this article để có giải thích chi tiết hơn.
Tôi muốn nói rằng hầu hết thời gian không bận tâm - trừ khi bạn mong đợi ứng dụng của bạn sử dụng gần 2GB RAM chỉ làm cho mục tiêu dự án của bạn chỉ x86, và nó sẽ chạy ở mọi nơi chỉ với phiên bản 32-bit của scilexer.dll. –