Eksperymentuję z ładowaniem złożenia przy użyciu tylko tablic bajtowych, ale nie wiem, jak sprawić, by działał poprawnie. Oto konfiguracja:Ładowanie zespołu tablicy bajtowej
public static void Main()
{
PermissionSet permissions = new PermissionSet(PermissionState.None);
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory };
AppDomain friendlyDomain = AppDomain.CreateDomain("Friendly", null, setup, permissions);
Byte[] primary = File.ReadAllBytes("Primary.dll_");
Byte[] dependency = File.ReadAllBytes("Dependency.dll_");
// Crashes here saying it can't find the file.
friendlyDomain.Load(dependency);
AppDomain.Unload(friendlyDomain);
Console.WriteLine("Stand successful");
Console.ReadLine();
}
Stworzyłem dwie makiety bibliotek DLL i przemianowany na ich przedłużenie do celowo więc system „.dll_” nie byłby w stanie znaleźć pliki fizyczne. Zarówno primary
i dependency
wypełnić poprawnie, ale gdy próbuję wywołać metodę AppDomain.Load
z danych binarnych, to wraca z:
Could not load file or assembly 'Dependency, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
Dlaczego byłoby przeszukanie systemu do pliku?
UPDATE
to z drugiej strony wydaje się działać:
public class Program {
public static void Main() {
PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted);
AppDomainSetup setup = new AppDomainSetup { ApplicationBase = Environment.CurrentDirectory };
AppDomain friendlyDomain = AppDomain.CreateDomain("Friendly", null, setup, permissions);
Byte[] primary = File.ReadAllBytes("Primary.dll_");
Byte[] dependency = File.ReadAllBytes("Dependency.dll_");
// Crashes here saying it can't find the file.
// friendlyDomain.Load(primary);
Stage stage = (Stage)friendlyDomain.CreateInstanceAndUnwrap(typeof(Stage).Assembly.FullName, typeof(Stage).FullName);
stage.LoadAssembly(dependency);
Console.WriteLine("Stand successful");
Console.ReadLine();
}
}
public class Stage : MarshalByRefObject {
public void LoadAssembly(Byte[] data) {
Assembly.Load(data);
}
}
Wygląda więc na to istnieje różnica między AppDomain.Load
i Assembly.Load
.
Czy biblioteka zależności Dependency nie ma żadnych zależności, które nie zostały skopiowane? –
Podstawowy polega na zależności. Zależność nie ma jednak żadnych zależności (nie od CLR). Wygląda na to, że środowisko wykonawcze nie powinno najpierw wyszukiwać pliku. – sircodesalot