49

ボタンを含むWPFC#アプリケーションがあります。

ボタンクリックのコードは、アプリケーションのランタイムディレクトリに配置される別のテキストファイルに書き込まれます。

ボタンをクリックするだけで、テキストファイルに配置されたコードを実行したいと思います。

これを行う方法はありますか?

4

5 に答える 5

94

コンパイルされたオンフライクラスメソッドを実行するためのコードサンプル:

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Net;
using Microsoft.CSharp;
using System.CodeDom.Compiler;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string source =
            @"
namespace Foo
{
    public class Bar
    {
        public void SayHello()
        {
            System.Console.WriteLine(""Hello World"");
        }
    }
}
            ";

             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, source);

            if (results.Errors.Count != 0)
                throw new Exception("Mission failed!");

            object o = results.CompiledAssembly.CreateInstance("Foo.Bar");
            MethodInfo mi = o.GetType().GetMethod("SayHello");
            mi.Invoke(o, null);
        }
    }
}
于 2010-11-15T06:07:47.667 に答える
38

Microsoft.CSharp.CSharpCodeProviderオンザフライでコードをコンパイルするために使用できます。特に、CompileAssemblyFromFileを参照してください。

于 2010-11-15T05:41:01.503 に答える
22

Microsoft Roslyn、特にそのScriptEngineクラスを確認することをお勧めします。まず、いくつかの良い例を示します。

  1. RoslynScriptingAPIの概要
  2. ValueConverterにRoslynScriptEngineを使用して、ユーザー入力を処理します

使用例:

var session = Session.Create();
var engine = new ScriptEngine();
engine.Execute("using System;", session);
engine.Execute("double Sin(double d) { return Math.Sin(d); }", session);
engine.Execute("MessageBox.Show(Sin(1.0));", session);
于 2012-11-10T12:15:57.033 に答える
3

誰かがC#Evalと呼ばれるこのためのライブラリを作成したようです。

編集:元のサイトが死んでいるように見えるため、Archive.orgを指すようにリンクを更新しました。

于 2014-02-04T20:11:22.817 に答える
2

必要なのは CSharpCodeProviderクラスです

それがどのように機能するかを理解するためのいくつかのサンプルがあります。

1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi

この例の重要な点は、実際にはすべてのことを皮剥ぎで行うことができるということです。

myCompilerParameters.GenerateExecutable = false;
myCompilerParameters.GenerateInMemory = false;

2 http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime

この例は、dllファイルを作成できるので、他のアプリケーション間で共有できます。

基本的に、 http://www.codeproject.com/search.aspx?q = csharpcodeprovider &x = 0&y = 0&sbo = kw&pgnum = 6を検索して 、より便利なリンクを取得できます。

于 2014-04-10T18:30:44.527 に答える