我有三个供应商提供的ole com库,它们为不同但类似的设备提供接口。这些库在设备之间不兼容,并且嵌入了不同的功能。它们也共享相同的ID,因此我一次只能在一台机器上注册一个。不幸的是,我没有源,也无法重新编译这些。
我的问题是,我经常需要能够与多个设备模型进行通信。
我尝试从特定路径加载dll并将其转换为程序集,创建它的实例并为我需要的函数提取methodinfo。这似乎有效。正如预期的那样,不同库的类型信息是不同的,但每当我实例化它时,它似乎仍然只加载已注册的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);
}
}