从COM ProgID加载.NET程序集而不创建COM对象
问题描述:
有点奇怪的问题,可能是大多数人想做的事情的后退,但我试图解决遗留COM问题。从COM ProgID加载.NET程序集而不创建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程序集,并可以通过接口来访问它。但是,这种技术有点笨拙,特别是在64位系统上,我遇到了COM方面的问题。如果可能的话,我宁愿消除加载COM对象并直接作为.NET程序集加载插件。
但是我唯一需要做的就是插件的COM ProgID。
那么,我怎样才能从一个COM ProgID加载一个.NET程序集,而不创建任何COM对象?
答
在注册表中查找与您的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
}
啊,没错。看起来我可能一直在想这个问题。我想也许有一种方法可以从类型而不是爬行注册表,但你的例子使它看起来相当简单。感谢代码片段,这让我的生活变得更加轻松,感谢您花时间做到这一点。 – 2009-10-23 18:34:49