11

現在、私はプロジェクトに取り組んでおり、チームはプロジェクト全体を再コンパイルせずにコードを記述して編集する方法を望んでいるため、スクリプトエンジンを実装することにしました。

以前にLuaをC++に実装したことがあるので、プロジェクトにスクリプト機能を実装するのはまったくの初心者ではありませんでした。ただし、Microsoft.CSharp名前空間をC#に既に組み込まれているSystem.Reflectionと組み合わせて使用​​して、ストレートC#を実装してみたかったのです。

それで、これについて聞いて、私はドキュメントを調べて、ALMOSTが機能するプロトタイプを思いつきましたが、完全には機能しません。

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

namespace Scripting
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder builder = new StringBuilder();
            builder.Append("using System;");
            builder.Append("using Scripting;");
            builder.Append("class MyScript : IScript");
            builder.Append("{");
            builder.Append("    string ScriptName");
            builder.Append("    {");
            builder.Append("        get { return \"My Script\"; }");
            builder.Append("    }");

            builder.Append("    public bool Initialize()");
            builder.Append("    {");
            builder.Append("        Console.WriteLine(\"Hello, World!\");");
            builder.Append("        return true;");
            builder.Append("    }");
            builder.Append("}");

            CSharpCodeProvider provider = new CSharpCodeProvider();
            CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
            param.GenerateInMemory = true;
            param.GenerateExecutable = true;
            CompilerResults result = provider.CompileAssemblyFromSource(param, builder.ToString());
            if (result.Errors.Count > 0)
            {
                foreach (CompilerError error in result.Errors)
                    Console.WriteLine(error);
                Console.ReadKey();
                return;
            }
        }
    }
}

私が現在抱えている問題は、コンパイラで記述および解析されたスクリプトがアクセスできるように、インターフェイス(IScript.cs(Scripting名前空間内にあるため現在のアセンブリ内))を参照できるようにしたいということです。明らかに、パラメータとしてScripting.dllを追加しましたが、何らかの理由でアクセスできないようです。私それをデバッグで実行しているので、これはいくつかの主要なfacepalmageの原因となる可能性があります。何をしますか?

現在のアセンブリを参照してCompilerParametersに渡す方法はありますか?それとも、私はひどくねじ込まれていますか/スクリプトオブジェクトなどのアセンブリの作成に依存する必要がありますか?

4

2 に答える 2

5

おそらく間違ったディレクトリを探しています。

パスtypeof(Program).Assembly.CodeBaseしてフルパスを渡します。

于 2012-05-18T17:28:29.340 に答える
3

実行可能ファイルを取得して、CompilerParametersに渡すことができます。

       string exeName = Assembly.GetEntryAssembly().Location;      
       param.ReferencedAssemblies.Add(exeName); 
于 2017-03-27T12:34:26.920 に答える