2009-10-21 208 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