"The process cannot access the file 'xxx.exe' because it is being used by another process." trotz AppDomain.CreateDomain

  • C#
  • .NET (FX) 4.0

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    "The process cannot access the file 'xxx.exe' because it is being used by another process." trotz AppDomain.CreateDomain

    Mein Plan ist es, aus (eigenen) Assemblies die Ressource-Strings auszulesen, um in einem Multi-Language-Projekt die Vollständigkeit dieser Strings in den Culture-DLLs zu überprüfen.
    Hier wurde von @~blaze~ ein äquivalentes Problem beschrieben, in der C#Corner habe ich eine Herangehensweise gefunden und verfolgt.
    Den Fehler von ~blaze~ "Pfad nicht gefunden" habe ich überwunden, indem ich alle Methoden, die ich benötige, direkt in der Klasse LoadeMyAssembly implementiert habe.
    Übrig geblieben ist momentan folgender Code:
    Spoiler anzeigen

    C#-Quellcode

    1. internal static string[] GetResourceNames(string file)
    2. {
    3. AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
    4. // Create an instance of loader class in new appdomain
    5. AppDomain newDomain = AppDomain.CreateDomain("newDomain", AppDomain.CurrentDomain.Evidence, setup);
    6. System.Runtime.Remoting.ObjectHandle obj = newDomain.CreateInstance(typeof(LoadMyAssembly).Assembly.FullName, typeof(LoadMyAssembly).FullName);
    7. // As the object we are creating is from another appdomain hence we will get
    8. // that object in wrapped format and hence in next step we have unwrappped it
    9. LoadMyAssembly loader = (LoadMyAssembly)obj.Unwrap();
    10. // Call loadassembly method so that the assembly will be loaded into the
    11. // new appdomain and the object will also remain in new appdomain only.
    12. loader.LoadAssembly(file);
    13. string[] names = loader.GetManifestResourceNames();
    14. // After the method has been executed call unload method of the appdomain.
    15. // Wow you have unloaded the new appdomain and also unloaded the loaded assembly from memory.
    16. AppDomain.Unload(newDomain);
    17. return names;
    18. }

    C#-Quellcode

    1. //Wow you have unloaded the new appdomain and also unloaded the loaded assembly from memory.
    2. //Here we complete the code in our main class and now here is the LoadMyAssembly class.
    3. class LoadMyAssembly : MarshalByRefObject
    4. {
    5. private Assembly _assembly;
    6. public override object InitializeLifetimeService()
    7. {
    8. return null;
    9. }
    10. public void LoadAssembly(string path)
    11. {
    12. _assembly = Assembly.Load(AssemblyName.GetAssemblyName(path));
    13. //_assembly = Assembly.LoadFile(path);
    14. }
    15. internal string[] GetManifestResourceNames()
    16. {
    17. return _assembly.GetManifestResourceNames();
    18. }
    19. }
    Trotz alledem wird die Exe mit AppDomain.Unload(newDomain); nicht entladen, denn ich kann sie nicht neu erstellen.
    Hat einer von Euch da was besseres gefunden?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Trotz alledem wird die Exe mit AppDomain.Unload(newDomain); nicht entladen, denn ich kann sie nicht neu erstellen.Hat einer von Euch da was besseres gefunden?

    Das kann ich nicht nachvollziehen. Bei gehts. Hab die Datei auch löschen können.
    Das ist meine Signatur und sie wird wunderbar sein!

    Mono schrieb:

    nicht nachvollziehen
    Mit welchen Framework- und Compilereinstellungen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da passiert was. 8o
    Nun meckert er die PDB an, die ich aber gar nicht anfasse.
    Vielleicht geht es, wenn ich die Datei(en) vorher umkopiere.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab den Code etwas aufgeräumt, sodass die Assemblies erst bei Start geladen werden, nun läuft es wie es soll. :thumbup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!