Mam dwa zespoły: App
i AddOn
. App
- referencje AddOn
, ale CopyLocal
jest ustawione na false
, ponieważ AddOn
będzie ładowane dynamicznie przez App
.Dlaczego potrzebuję obsługi AssemblyResolve dla zespołu, który jest już załadowany?
Oto kod w AddOn
:
namespace AddOn
{
public class AddOnClass
{
public static void DoAddOnStuff()
{
Console.WriteLine("AddOn is doing stuff.");
}
}
}
i oto kod w 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();
}
}
Co ja nie rozumiem, dlaczego kod nie działa z AssemblyResolve
przewodnik skomentował w Main()
. Po uruchomieniu w Visual Studio debuger łamie się na CallAddOn()
za pomocą . Dlaczego narzeka? Zespół jest ładowany i jest to dokładnie ta sama wersja (to jest ten sam plik na dysku), co zostało wymienione w App
.
Mam wrażenie, że istnieje pewne podstawowe pojęcie, którego tutaj nie rozumiem. Komentarz z obsługą AssemblyResolve
działa dobrze, ale wygląda na to, że jest hackerem i nie rozumiem, dlaczego go potrzebuję, ponieważ wygląda na to, że robi coś trywialnego.
Robisz to źle. Kiedy zezwalasz na używanie dodatków w swoim programie, * nie wiesz * typu klasy w dodatku. Został napisany przez innego programistę. Więc powinieneś być bardzo zainteresowany wartością zwracaną przez LoadFrom(), na przykład użyjesz Assembly.GetType(), aby odkryć typ. –
Jest to dodatek, który odwołuje się do innego dodatku, ponieważ polega na tej funkcji. – RobSiklos
To nie jest dodatek, tylko normalny zestaw zależny. Zawsze używasz opcji Kopiuj lokalne = Prawda, aby zapewnić, że narzędzie CLR może znaleźć zestaw automatycznie, bez konieczności pomocy. Jakie jest ustawienie domyślne. –