2

有点奇怪的问题,可能与大多数人想做的事情相反,但我正在尝试解决遗留的 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 对象的情况下从 COM ProgID 转到加载 .NET 程序集?

4

1 回答 1

4

在注册表中查找与您拥有的 ProgID 关联的 DLL。获得完整路径后,将其作为普通的 .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
}
于 2009-10-21T13:28:12.040 回答