我有两个程序集: App
和 AddOn
。 App
引用了 AddOn
,但是 CopyLocal
被设置为 false
,因为 AddOn
将由 App
动态加载。
这是 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();
}
}
我不理解的是,为什么在Main()
中注释掉AssemblyResolve
处理程序后代码就不能正常工作。在Visual Studio中运行时,调试器会在CallAddOn()
处中断,并显示FileNotFoundException
的错误信息。为什么会出现这种情况呢?该程序集已经被加载了,并且它与App
引用的程序集完全相同(即磁盘上的同一文件)。我感觉我没有正确理解某些基本概念。尽管已经注释掉了
AssemblyResolve
处理程序,但它似乎仍然可以正常工作,但它似乎像是一个黑客技巧,我不明白为什么需要它,因为它似乎只是做了一些微不足道的事情。