Feedback

C# - Ein C# Script zur laufzeit kompilieren und aufrufen

Veröffentlicht von am 4/10/2012
(1 Bewertungen)
**********
** V1.0 **
**********

.net 3.5 oder höher wird benötigt

Die ist die erste Version des snippet. Ich werde das ganze einmal anpassen um auch rückgabewerte aus dem script aufzunehmen.

Mit Hilfe es snippet ist es möglich einen Sourcecode zur laufzeit zu kompilieren und zu exekutieren.

Die File die aufgerufen wird muss den gleichen namen haben wie die Klasse. zb.


using System;
using System.Windows.Forms;
public class call {
public void SayHello()
{
MessageBox.Show("Hello from class");

}

}


muss in call.cs gespeichert sein.
Ihr könnt es auch gerne mit dem Code oben versuchen so wie ich es unten mache.



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

public Dictionary<string, string> RunSourceCode(string sourcefile, string functionname, params string[] loadDLL)
        {
            try
            {
              
                string classname = System.IO.Path.GetFileName(sourcefile).Replace(".cs", ""); 
                Dictionary<string, string> providerOptions = new Dictionary<string, string>
                    {
                        {"CompilerVersion", "v3.5"}
                    };
                CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
                CompilerParameters compilerParams = new CompilerParameters();
                compilerParams.GenerateInMemory = true;
                compilerParams.GenerateExecutable = false;

                for (int i = 0; i < loadDLL.Length; i++)
                {
                    compilerParams.ReferencedAssemblies.Add(loadDLL[i]);
                }

                CompilerResults results = provider.CompileAssemblyFromFile(compilerParams, sourcefile);

                if (results.Errors.Count > 0)
                {
                    Dictionary<string, string> retDict = new Dictionary<string, string>();
                    foreach (CompilerError CompErr in results.Errors)
                    {
                       
                        retDict.Add(CompErr.ErrorNumber, CompErr.ErrorText);
                    }

                    return retDict;
                }
                else
                {
                    object o = results.CompiledAssembly.CreateInstance(classname);

                    MethodInfo mi = o.GetType().GetMethod(functionname);
                    object oRet = mi.Invoke(o, null);
                    return new Dictionary<string, string>();
                                  
                }

                
            }
            catch(Exception ex)
            {
                return new Dictionary<string,string>{{"-1", ex.Message.ToString()}};
            }

           
        }


public void Test()
        {
            Dictionary<string, string> ret = new Dictionary<string, string>();
            ret = RunSourceCode("D:\\call.cs", "SayHello", "System.dll", "System.Windows.Forms.dll");
            foreach (var pair in ret)
            {
                MessageBox.Show(pair.Value, pair.Key);
            }

        }

1 Kommentare zum Snippet

RoSi schrieb am 4/18/2012:
"Mit Hilfe es snippet ist es möglich ... zu exekutieren."

Exekutieren ist gut.
 

Logge dich ein, um hier zu kommentieren!