加载从COM的ProgID一个.NET组件,而无需创建一个COM对象(Load a .NET ass

2019-08-31 05:29发布

一个奇怪的问题,可能向后从大多数人想做的事,但我试图解决一个传统的COM问题有点。

我有两个部件,这两个实际上是.NET组件,但由于历史的原因之一被装载其他作为COM对象(该组件被注册为COM互操作)。 这是一个插件架构,其中插件是由它的COM进程id识别,所以这是唯一的信息块,我得到加载插件组装。

一种技术我已经试过是:

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

如果转换到.NET接口成功,我知道我有一个.NET程序集,并可以通过接口来访问它。 然而,该技术是一个有点笨拙,我掌握的东西尤其是在64位系统中的COM方面的问题。 我宁愿只消除加载COM对象和直接,加载插件作为.NET程序集如果可能的话。

但我得去信息的唯一的一块是插件的COM进程id。

所以,我怎样才能从COM进程id去加载.NET程序集, 而不会产生任何COM对象

Answer 1:

查找在注册表中找到你所拥有的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
}


文章来源: Load a .NET assembly from a COM ProgID without creating a COM object