通常我們經常添加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內創建分類實例?
請詳細討論我的興趣點。謝謝