是否可以在C#中同时加载具有相同GUID / CLSID的两个不同的ole com库

时间:2012-08-05 21:26:51

标签: c# dll com ole

我有三个供应商提供的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);
  }
}

0 个答案:

没有答案