Exécution de code dynamique dans les applications WPF C#
Cet article aborde le problème de l'exécution de code à partir d'un fichier texte externe au sein d'une application WPF C#. Le fichier texte, contenant le code à exécuter, réside dans le répertoire d'exécution de l'application.
Mise en œuvre
Cette solution exploite une combinaison de techniques de compilation de code et de réflexion. Le processus implique la compilation en temps réel du code à partir du fichier texte, puis l'instanciation et l'invocation ultérieures de la méthode cible à partir de l'assembly compilé.
L'extrait de code suivant illustre cette approche :
<code class="language-csharp">// ... code ... Dictionary<string, string> providerOptions = new Dictionary<string, string> { {"CompilerVersion", "v3.5"} }; CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); CompilerParameters compilerParams = new CompilerParameters { GenerateInMemory = true, GenerateExecutable = false }; CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, sourceCode); if (results.Errors.Count > 0) throw new Exception("Compilation failed!"); object instance = results.CompiledAssembly.CreateInstance("Foo.Bar"); // Assuming the class is named "Bar" in the "Foo" namespace MethodInfo method = instance.GetType().GetMethod("SayHello"); // Assuming the method is named "SayHello" method.Invoke(instance, null);</code>
Explication détaillée
Le code lit d'abord le code C# du fichier texte dans une variable chaîne (sourceCode
). Un CSharpCodeProvider
est initialisé avec les options spécifiées du compilateur. CompilerParameters
sont configurés pour générer l'assembly compilé en mémoire, sans créer de fichier exécutable. La méthode CompileAssemblyFromSource
effectue ensuite la compilation.
La vérification des erreurs suit le processus de compilation. Si la compilation réussit, une instance de la classe compilée est créée à l'aide de CreateInstance
et la méthode spécifiée est invoquée à l'aide de GetMethod
et Invoke
. Cela permet une exécution dynamique du code chargé en externe. Notez que les noms d’espace de noms et de classe/méthode doivent correspondre au code du fichier texte. La gestion des erreurs (par exemple, des blocs try-catch) doit être ajoutée pour plus de robustesse dans un environnement de production.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!