0

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

0 回答 0