Ich habe zwei Baugruppen: App
und . App
Referenzen , aber CopyLocal
ist auf false
eingestellt, da wird dynamisch von App
geladen werden. HierWarum benötige ich einen AssemblyResolve-Handler für eine Assembly, die bereits geladen ist?
ist der Code in AddOn
:
namespace AddOn
{
public class AddOnClass
{
public static void DoAddOnStuff()
{
Console.WriteLine("AddOn is doing stuff.");
}
}
}
und hier ist der Code in 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();
}
}
Was ich nicht verstehe ist, warum der Code nicht mit der AssemblyResolve
funktioniert Handler kommentiert in Main()
. Bei Ausführung in Visual Studio bricht der Debugger CallAddOn()
mit einem FileNotFoundException
. Warum beschwert es sich? Die Assembly wird geladen, und es ist die exakt gleiche Version (d. H. Die gleiche Datei auf der Festplatte), auf die von App
verwiesen wurde.
Ich habe das Gefühl, dass es ein grundlegendes Konzept gibt, das ich hier nicht richtig verstehe. Der kommentierte AssemblyResolve
Handler funktioniert gut, aber es scheint wie ein Hack und ich verstehe nicht, warum ich es brauche, weil es so aussieht, als würde es etwas Triviales tun.
Sie tun das falsch. Wenn Sie zulassen, dass Add-Ons in Ihrem Programm verwendet werden, kennen Sie * den Typ der Klasse im Add-On nicht. Es wurde von einem anderen Programmierer geschrieben. Sie sollten also ziemlich an dem Rückgabewert von LoadFrom() interessiert sein, Sie werden beispielsweise Assembly.GetType() verwenden, um einen Typ zu ermitteln. –
Es ist ein Addon, das auf ein anderes Addon verweist, weil es sich auf diese Funktionalität verlässt. – RobSiklos
Das ist kein Addon, nur eine normale abhängige Assembly. Sie verwenden immer "Copy Local = True", um sicherzustellen, dass die CLR die Assembly automatisch finden kann, ohne dass Sie Hilfe benötigen. Welches ist die Standardeinstellung? –