2009-10-21 82 views
1

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

回答

3

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

啊,没错。看起来我可能一直在想这个问题。我想也许有一种方法可以从类型而不是爬行注册表,但你的例子使它看起来相当简单。感谢代码片段,这让我的生活变得更加轻松,感谢您花时间做到这一点。 – 2009-10-23 18:34:49