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

时间:2009-10-21 13:06:04

标签: .net com-interop legacy

有点奇怪的问题,可能是大多数人想要做的事情,但我正试图解决传统的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对象

1 个答案:

答案 0 :(得分:4)

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