Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Objekte an Laufzeit kompilierten Code übergeben oder auslesen (allgemeine Kommunikation)
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

Objekte an Laufzeit kompilierten Code übergeben oder auslesen (allgemeine Kommunikation)

beantworten | zitieren | melden

Oft wünscht man sich vielleicht an ein kompiliertes Script Parameter übergeben zu können.
Das ist ja eigentlich nicht so ohne weiteres möglich.

Wenn wir uns aber Interfaces schaffen, können wir Sachen anstellen, die ganz interessant sind.

Für den Compiler benötigen wir folgende Usings.


using System;
using System.Reflection;
using Microsoft.CSharp;
using System.CodeDom.Compiler; 

Zuerst brauchen wir ein Interface an das wir etwas übergeben möchten:


public interface IScript
{
void Run(CNode node);
} 

Im Konstruktor der CScript-Klasse kompilieren wir das dort enthaltene Script:


        public CScript(string _sName, params string[] _aReferencedAssemblies)
        {
            this.m_sName = _sName;
            this.m_aReferencedAssemblies = _aReferencedAssemblies;
            this.m_sFullSource =
                    @"using ScriptTest;
                    using System.Windows.Forms;
                    namespace MyProgram
                    {
                        public class Test : IScript
                        {
                            public void Run(CNode node)
                            {
                                MessageBox.Show(node.Name);
                            }
                        }
                    }";

            CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider();
            ICodeCompiler compiler = csharpCodeProvider.CreateCompiler();
            CompilerParameters compilerParameters = new CompilerParameters();

            compilerParameters.GenerateInMemory = true;
            compilerParameters.ReferencedAssemblies.AddRange(_aReferencedAssemblies);

            this.m_CompilerResults = compiler.CompileAssemblyFromSource(compilerParameters, m_sFullSource);
        }



Ausserdem enthält CScript eine Methode namens “Run”, die zwar nicht benötigt wird, da wir eine Instanz der kompilierten Klasse erstellen und über IScript darauf zugreifen.


        public void Run()
        {
            IScript script = m_CompilerResults.CompiledAssembly.CreateInstance("MyProgram." + m_sName) as IScript;
            script.Run(new CNode("OKI Doki!!!"));
        }
    }
}

Wir benötigen aber wohl die Methode „Run“ aus dem Interface der wir die gewünschte Node übergeben. In diesem Falle geschehen in der Zeile.
Die Zur Laufzeit kompilierte Klasse implementiert ebenfalls dieses Interface. Das ist die Besonderheit an diesem Konstrukt.


script.Run(new CNode("OKI Doki!!!"));

Wenn wir jetzt also das Script ausführen, erhalten wir tatsächlich als Ausgabe eine MessageBox mit der Ausgabe "OKI Doki!!!".

Erweitern wir jetzt das Interface nach unseren Wünschen können wir sowohl Eingaben als auch Ausgaben machen.

Wichtig ist auch hierbei noch der Aufruf:


CScript script = new CScript("Test","mscorlib.dll", "system.dll",
"ScriptTest.exe", "System.Windows.Forms.dll");
            script.Run();

Der erste Parameter war nur gedacht, um dem Script einen Namen zu verpassen und hat momentan sonst keine weitere Funktion.
Alle weiteren Parameter sind Referenzen auf die benötigten DLLs und die Exe in der wir uns befinden „ScriptTest.exe“.

Wir können jetzt also tatsächlich mit der IScript-Schnittstelle mit dem kompilierten Code anstellen was wir wollen, ein entsprechendes Interface vorausgesetzt natürlich.

Damit haben wir jetzt die Möglichkeit Code z.B. in XML auszulagern der während dem Ausführen kompiliert wird und können Parameter an diesen übergeben oder von diesem auslesen.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.908
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

Hier das Beispielprojekt:
Attachments
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
private Nachricht | Beiträge des Benutzers