我有两个程序集: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可以自动查找组件,而无需您的帮助。这是默认设置。 –