我有三个供应商提供的 ole com 库,它们为不同但相似的设备提供接口。这些库在设备之间不兼容,并且嵌入了不同的功能。它们也都共享相同的 ID,所以我一次只能在一台机器上注册一个。不幸的是,我没有源代码,也无法重新编译它们。
我的问题是,我经常需要能够与不止一种型号的设备进行通信。
我尝试从特定路径加载 dll 并将其转换为程序集,创建它的实例并为我需要的函数提取方法信息。这似乎有效。正如预期的那样,不同库的类型信息是不同的,但是每当我实例化它时,它似乎仍然只加载注册的 dll,因为如果我调用不在当前注册的 dll 中的函数,它会崩溃并因访问冲突而烧毁。有没有人有任何想法?
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode, PreserveSig = false)]
public static extern void LoadTypeLibEx(String strTypeLibName, RegKind regKind, [MarshalAs(UnmanagedType.Interface)] out Object typeLib);
public enum RegKind
{
RegKind_Default = 0,
RegKind_Register = 1,
RegKind_None = 2
}
private void Initialize() {
Type ct;
object typeLib;
try {
// Load DLL
LoadTypeLibEx(@"c:\temp\zkA11C\zkemkeeper.dll", RegKind.RegKind_None, out typeLib);
if (typeLib == null)
throw new Exception("LoadTypeLibEx returned null pointer");
TypeLibConverter converter = new TypeLibConverter();
ConversionEventHandler eventHandler = new ConversionEventHandler();
AssemblyBuilder zkA11C = converter.ConvertTypeLibToAssembly(typeLib, "zkA11C.dll", 0, eventHandler, null, null, null, null);
// Get class type
ct = zkA11C.GetType("zkA11C.CZKEMClass");
// Create instance of the class
dllClassInstance = Activator.CreateInstance(ct);
// Get method info for functions
fmiConnect = ct.GetMethod("Connect_Net");
...
}
catch (Exception e) {
throw new Exception("Failed to load library: " + e.Message);
}
}