我有兩個程序集:App
和AddOn
。 App
參考文獻AddOn
,但CopyLocal
設置爲false
,因爲AddOn
將由App
動態加載。爲什麼我需要一個已經加載的程序集的AssemblyResolve處理程序?
這裏是AddOn
代碼:
namespace AddOn
{
public class AddOnClass
{
public static void DoAddOnStuff()
{
Console.WriteLine("AddOn is doing stuff.");
}
}
}
,這裏是在App
代碼:
class Program
{
static void Main(string[] args)
{
Assembly.LoadFrom(@"..\..\..\AddOn\bin\Debug\AddOn.dll");
// Without this event handler, we get a FileNotFoundException.
// AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
// {
// return AppDomain.CurrentDomain.GetAssemblies()
// .FirstOrDefault(a => a.FullName == e.Name);
//};
CallAddOn();
}
[MethodImpl(MethodImplOptions.NoInlining)]
private static void CallAddOn()
{
AddOnClass.DoAddOnStuff();
}
}
我不明白的是爲什麼代碼不與AssemblyResolve
工作處理程序在Main()
中進行了註釋。在Visual Studio中運行時,調試程序會在CallAddOn()
上打開FileNotFoundException
。它爲什麼抱怨?該程序集被加載,並且與App
引用的是完全相同的版本(即磁盤上的相同文件)。
我覺得這裏有一些基本的概念,我沒有正確理解。評論AssemblyResolve
處理程序工作正常,但它似乎是一個黑客,我不明白爲什麼我需要它,因爲它似乎在做一些微不足道的事情。
你這樣做是錯誤的。當你允許在你的程序中使用插件時,你*不知道插件中類的類型。它是由另一位程序員編寫的。所以你應該對LoadFrom()的返回值很感興趣,例如你可以使用Assembly.GetType()來發現一個類型。 –
這是一個引用另一個插件的插件,因爲它依賴於該功能。 – RobSiklos
這不是一個插件,只是一個正常的相關程序集。您始終使用Copy Local = True來確保CLR可以自動查找組件,而無需您的幫助。這是默認設置。 –