2012-05-08 44 views
1

通常我們經常添加dll的引用,然後在該dll中訪問分類並創建該分類的實例。現在我已經在我的項目中包含了一個dll文件作爲嵌入資源。現在我的問題是,我如何訪問類,並創建那個類中的實例,這是在那個包含爲嵌入資源的DLL中。我搜索谷歌和發現像Embedding one dll inside another as an embedded resource and then calling it from my code需要使用dll作爲嵌入式資源包含在項目中

我發現那裏訪問DLL中的指令,包括像

內嵌資源一旦你嵌入第三方組件的資源鏈接計算器,代碼添加到訂閱到應用程序啓動期間當前域的AppDomain.AssemblyResolve事件。只要CLR的Fusion子系統根據有效的探測(策略)未能找到組件,此事件就會觸發。在AppDomain.AssemblyResolve的事件處理程序中,使用Assembly.GetManifestResourceStream加載資源並將其內容作爲字節數組提供給相應的Assembly.Load重載。下面是一個這樣的實現可能看起來怎麼樣在C#:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => 
{ 
var resName = args.Name + ".dll";  
var thisAssembly = Assembly.GetExecutingAssembly();  
using (var input = thisAssembly.GetManifestResourceStream(resName)) 
{ 
    return input != null 
     ? Assembly.Load(StreamToBytes(input)) 
     : null; 
} 
}; 

其中StreamToBytes可以定義爲:

static byte[] StreamToBytes(Stream input) 
{ 
var capacity = input.CanSeek ? (int) input.Length : 0; 
using (var output = new MemoryStream(capacity)) 
{ 
    int readLength; 
    var buffer = new byte[4096]; 

    do 
    { 
     readLength = input.Read(buffer, 0, buffer.Length); 
     output.Write(buffer, 0, readLength); 
    } 
    while (readLength != 0); 

    return output.ToArray(); 
} 
} 

幾件事情並不清楚,我認爲。該人稱

添加代碼以在應用程序啓動期間訂閱當前域的AppDomain.AssemblyResolve事件。只要CLR的Fusion子系統根據有效的探測(策略)未能找到組件,此事件就會觸發。

什麼是CLR的Fusion子系統失敗?這是什麼意思?當AssemblyResolve事件將會觸發時,會出現 。我是否需要將此代碼放入我的program.cs文件中。

Assembly.Load()只會將程序集加載到內存中,但是 他們沒有顯示如何在該dll內創建分類實例?

請詳細討論我的興趣點。謝謝

回答

1

什麼是CLR的Fusion子系統失敗?這是什麼意思?

This article解釋它的細節(尤其是部分探測的位(融合)):

探測當無法定位的組件,它會觸發 AppDomain.AssemblyResolve事件,允許用戶代碼執行其自定義加載。如果一切都失敗,則拋出TypeLoadException (如果由於對依賴程序集中駐留的類型爲 的引用而調用裝入進程)或FileNotFoundException(如果手動調用裝入進程 進程)。


Assembly.Load()將只加載程序集到內存中,但他們沒有 展示如何創建該DLL裏面歸類實例?

Another question in SO解釋瞭如何在動態加載的程序集中創建類型的實例。

相關問題