Sto sperimentando il caricamento di un assieme utilizzando solo array di byte, ma non riesco a capire come farlo funzionare correttamente. Ecco il programma di installazione:Loading Byte Array Assembly
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();
}
ho creato due DLL finte, e rinominato la loro estensione a '.dll_' intenzionalmente in modo che il sistema non sarebbe in grado di trovare i file fisici. Sia primary
e dependency
riempire in modo corretto, ma quando provo a chiamare il metodo AppDomain.Load
con i dati binari, ritorna con:
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.
perché dovrebbe essere alla ricerca del sistema per un file?
UPDATE
Questo d'altra parte sembra funzionare:
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);
}
}
Così sembra che ci sia una differenza tra AppDomain.Load
e Assembly.Load
.
La Dipendenza DLL ha dipendenze che non sono state copiate, forse? –
Il primario si affida alla dipendenza. Tuttavia, la dipendenza non ha dipendenze (non CLR). Sembra che il runtime non dovrebbe cercare il file con cui iniziare. – sircodesalot