Laden...

CodeDOM: temporäre DLL löschen

Erstellt von Christel vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.273 Views
C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 13 Jahren
CodeDOM: temporäre DLL löschen

Hallo,
ich habe eine Anwendung, die mittels des CodeDOM Features C# Dateien einliest, dynamisch kompiliert und ausführt. Das funzt auch prima. Nur stört mich jetzt, dass am Ende im TEMP-Verzeichnis meines PCs jedesmal eine DLL übrigbleibt.

Ich habe bereits versucht, die Klasse TempFileCollection zu benutzen, aber die DLLs sind hartnäckig.


            Assembly assembly = CompileSource(sourceCode);
            if (assembly != null)
            {
                TempFileCollection tfc = new
TempFileCollection(Path.GetDirectoryName(assembly.ManifestModule.FullyQualifiedName));
                tfc.AddFile(assembly.ManifestModule.FullyQualifiedName, false);
                
                // Instanz erzeugen 
                Type fType = assembly.GetTypes()[0];
                Type iType = fType.GetInterface("IExecute");
                if (iType != null)
                {
                    IExecute myScript = (IExecute)assembly.CreateInstance(fType.FullName);

                    // Events abonieren
                    myScript.Set += new SetHandler(Set);
                    myScript.Get += new GetHandler(Get);

                    // Script-Datei mit Parametern ausführen
                    errorCode = myScript.Execute();

                    tfc.Delete();
                }
            }

...

        private Assembly CompileSource(string sourceCode)
        {
            CodeDomProvider cpd = new CSharpCodeProvider();
            CompilerParameters cp = new CompilerParameters();
            cp.ReferencedAssemblies.Add("System.dll");
            cp.ReferencedAssemblies.Add (Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly ().Location) + "\\IExecute.dll");
            cp.GenerateExecutable = false;
            
            // dynamischen SourceCode kompilieren
            CompilerResults cr = cpd.CompileAssemblyFromSource(cp, sourceCode);

              return cr.CompiledAssembly;
        }

Hat jemand ne Idee, wie ich die DLLs sauber und elegant wieder wegbekomme?

Danke,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

T
94 Beiträge seit 2007
vor 13 Jahren

Kannst du die Assembly nicht einfach im Speicher vorhalten anstelle einer physikalischen Datei?


cp.GenerateInMemory = true;

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 13 Jahren

Danke, das werde ich gleich mal probieren.
Gruß, Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 13 Jahren

OK, für den normalen Betrieb funzt der vorgeschlagene Weg perfekt.
Nur, wenn ich den dynamischen Code per CLR-Debugger debuggen will, brauche ich die DLL und die zugehörige PDB. Das ist aber ein Ausnahmefall, in dem ich die DLLs selber wieder bereinigen kann.

Nachmals danke für den Tipp,
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.