【问题标题】:Load a .NET assembly from a COM ProgID without creating a COM object从 COM ProgID 加载 .NET 程序集而不创建 COM 对象
【发布时间】:2009-10-21 13:06:04
【问题描述】:

有点奇怪的问题,可能与大多数人想做的事情相反,但我正在尝试解决遗留的 COM 问题。

我有两个组件,这两个组件实际上都是 .NET 程序集,但由于历史原因,一个组件将另一个组件作为 COM 对象加载(该程序集已注册为 COM Interop)。它是一种插件架构,其中插件由其 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 对象

【问题讨论】:

    标签: .net com-interop legacy


    【解决方案1】:

    在注册表中查找与您拥有的 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
    }
    

    【讨论】:

    • 啊,对。看来我可能是在想这个问题。我在想也许有一种方法可以从类型而不是爬取注册表,但是您的示例使它看起来相当简单。感谢您提供的代码 sn-p,它让我的生活更轻松,感谢您抽出宝贵时间。
    猜你喜欢
    • 2011-03-05
    • 2010-11-18
    • 2011-08-18
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 2015-06-20
    • 2020-06-17
    相关资源
    最近更新 更多