代码之家  ›  专栏  ›  技术社区  ›  Tim Long

从COM ProgID加载.NET程序集,而不创建COM对象

  •  1
  • Tim Long  · 技术社区  · 15 年前

    这是一个有点奇怪的问题,可能和大多数人想做的事情背道而驰,但我正在努力解决一个遗留的COM问题。

    我有两个组件,这两个组件实际上都是.NET程序集,但出于历史原因,一个组件将另一个组件作为COM对象加载(该程序集是为COM互操作注册的)。它是一个插件架构,插件由其COM ProgID标识,因此这是我加载插件程序集所获得的唯一信息。

    我尝试过的一种方法是:

    var objType = Type.GetTypeFromProgID("My.ProgId");
    var objLateBound = Activator.CreateInstance(objType);
    IMyInterface netAssembly;
    try
        {
        netAssembly = (IMyAssembly)objLateBound;
        }
    catch (Exception)
        {
        netAssembly = null;
        }
    

    如果对.NET接口的强制转换成功,我知道我有一个.NET程序集,可以通过接口访问它。然而,这项技术有点笨拙,我在COM方面遇到了一些问题,尤其是在64位系统上。如果可能的话,我宁愿不加载COM对象,直接将插件作为.NET程序集加载。

    但是,我要讲的唯一信息就是插件的COM ProgID。

    那么,如何从COM ProgID加载.NET程序集, 不创建任何COM对象 ?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Darin Dimitrov    15 年前

    在注册表中查找与您的progid关联的dll。一旦你有了完整的道路, load 它是一个普通的.NET程序集:

    var type = Type.GetTypeFromProgID("My.ProgId", true);
    var regPath = string.Format(@"{0}\CLSID\{1:B}\InProcServer32", 
        Registry.ClassesRoot, type.GUID);
    var assemblyPath = Registry.GetValue(regPath, "", null);
    if (!string.IsNullOrEmpty(assemblyPath))
    {
        var assembly = Assembly.LoadFrom(assemblyPath);
        // Use it as a normal .NET assembly
    }