Utworzono AppDomain
z innym katalogiem bazowym. Jednak nie mogę załadować aktualnie wykonywanego zespołu do drugiej domeny aplikacji bez posiadania kopii bieżącego zespołu wykonawczego w katalogu podstawowym. Próbowałem nawet załadować go z bajtów.Załaduj bieżący zestaw do innej AppDomain
mam żadnego wyjątku, gdy próbuję załadować, ale gdy próbuję użyć:
domain.DoCallBack(new CrossAppDomainDelegate(...
uzyskać:
Nie można załadować pliku lub zestawu ....... .... System nie może odnaleźć określonego pliku.
Mój kod wygląda następująco:
private static void SaveAssemblies(Assembly ass, List<byte[]> assemblyByteList)
{
AssemblyName[] assNames = ass.GetReferencedAssemblies();
foreach (AssemblyName assName in assNames)
{
Assembly referedAss = Assembly.Load(assName);
if (!referedAss.GlobalAssemblyCache)
{
SaveAssemblies(referedAss, assemblyByteList);
}
}
byte[] rawAssembly = File.ReadAllBytes(ass.Location);
assemblyByteList.Add(rawAssembly);
}
public static AppDomain CreateAppDomain(string dir, string name)
{
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = dir;
domainSetup.ApplicationName = Path.GetFileName(dir);
domainSetup.PrivateBinPath = Path.Combine(dir, "Libs");
AppDomain domain = AppDomain.CreateDomain(name, null, domainSetup);
//Load system assemblies needed for the module
List<byte[]> assemblyByteList = new List<byte[]>();
SaveAssemblies(Assembly.GetExecutingAssembly(), assemblyByteList);
foreach (byte[] rawAssembly in assemblyByteList)
domain.Load(rawAssembly);
domain.DoCallBack(new CrossAppDomainDelegate(SetupLogging));
return domain;
}
Aktualizacja:
Wydaje się, że zespół jest ładowany, gdy patrzę na wyjściu widzę to
„TaskExecuter.Terminal.vshost. exe '(zarządzany (v4.0.30319)): Załadowano' NLog ' ' TaskExecuter.Terminal.vshost.exe '(Zarządzany (v4.0.30319)): Załadowano' TaskExecuter ', załadowano symbole.
ale wciąż wyjątek ... Nie rozumiem tego
System.IO.FileNotFoundException był nieobsługiwany Message = Nie można załadować pliku lub zestawu „TaskExecuter, Version = 1.0.4244.31921, Kultura = neutralny, PublicKeyToken = null 'lub jedna z jego zależności. System nie może znaleźć określonego pliku. Source = mscorlib
FileName = TaskExecuter, wersja = 1.0.4244.31921, Culture = neutralny, PublicKeyToken = null FusionLog ==== Informacje o stanie pre-bind === LOG: Użytkownik = Peter-PC \ Peter LOG: DisplayName = TaskExecuter, Version = 1.0.4244.31921 Kultura = neutralne TokenKluczaPublicznego = NULL (pełni funkcjonalne) log: Appbase = plików /// C:/ProgramData/TaskExecuter/TaskLib/uTorrentTasks log: Początkowa PrivatePath = C: \ ProgramData \ TaskExecuter \ TaskLib \ uTorrentTasks \ Libs Wywołanie zespołu: (Nieznany). === LOG: To powiązanie rozpoczyna się w domyślnym kontekście ładowania. LOG: przy użyciu pliku konfiguracyjnego aplikacji: d: \ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter.Terminal \ bin \ Release \ TaskExecuter.Terminal.vshost.exe.Config LOG: Użycie pliku konfiguracyjnego hosta : LOG: przy użyciu konfiguracji urządzenia plik z C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config. LOG: Zasada nie jest stosowana do odniesienia w tym momencie (prywatne, niestandardowe, częściowe lub oparte na lokalizacji powiązanie zespołu). LOG: Próba pobrania nowego adresu URL : /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.DLL. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.DLL. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.DLL. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.DLL. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter.EXE. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/TaskExecuter/TaskExecuter.EXE. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter.EXE. LOG: Próba pobrania nowego adresu URL file: /// C: /ProgramData/TaskExecuter/TaskLib/uTorrentTasks/Libs/TaskExecuter/TaskExecuter.EXE.StackTrace: na System.Reflection.RuntimeAssembly._nLoad (AssemblyName fileName, String CODEBASE, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, logiczne suppressSecurityChecks) na System.Reflection. RuntimeAssembly.nLoad (AssemblyName fileName, String cODEBASE, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark & stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, logiczne suppressSecurityChecks) w System.Reflection.RuntimeAssembly.InternalLoadAssemblyName (AssemblyName assemblyRef dowody assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection, logiczne suppressSecurityChecks) w System.Reflection.RuntimeAssembly.InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark & stackMark, Boolean forIntrospection) na System.Reflection.Assembly.Load (String assemblyString) na System.Runtime.Serialization.FormatterServices.LoadAssemblyFromString (String AssemblyName) na System.Reflection.MemberInfoSeriali zationHolder..ctor (SerializationInfo informacji, kontekst StreamingContext) na System.AppDomain.DoCallBack (CrossAppDomainDelegate callBackDelegate) na TaskExecuter.AppDomainHelper.CreateAppDomain (String dir, String name) w D: \ Users \ Piotr \ Documents \ wizualny studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ AppDomainHelper.cs: linia 50 na TaskExecuter.TaskManagment.TaskFinder.Probe() in d: \ Users \ Piotr \ Documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskFinder.cs: linia w TaskExecuter.TaskManagment.TaskManager.LoadTasks() w d: \ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskManager.cs: linia na TaskExecuter.TaskManagment.TaskManager.Start() in d: \ Users \ Piotr \ Documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter \ TaskManagment \ TaskManager.cs: linia w TaskExecuter.Terminal.Program.Main (String [] args) w d: \ users \ peter \ documents \ visual studio 2010 \ Projects \ TaskExecuter \ TaskExecuter.Terminal \ Program .cs: linia 16 w System.AppDomain._nExecuteAssembly (montaż RuntimeAssembly, łańcuchowe [] arg) w System.AppDomain.ExecuteAssembly (string assemblyFile, Evidence assemblySecurity, String [] args) pod Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() w System.Threading.ThreadHelper.ThreadStart_Context (Przedmiot stan) w System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback zwrotna, stanu obiektu, logiczna ignoreSyncCtx) w System.Threading.ExecutionContext.Run (ExecutionContext executionContext, ContextCallback zwrotna, obiekt stan) na System.Threading.ThreadHelper.ThreadStart()
InnerException:
Przyjemną praktyką jest nieskompilowanie zespołu do prostego "tyłka". Mógłby zachowywać się milej, gdyby nie tak nazwany :). –
@AlexeiLevenkov, po prostu zaczekaj, aż zaczniesz budować konstruktor stringów, aby rejestrować informacje o złożeniach. Jak nazwałbyś tę zmienną tym skrótem? (pluginLog, domainLog, typeLog, ___) – JoeBrockhaus