6

CS-Scriptライブラリを使用して動的コードを実行しています。スクリプト エンジンとして使用するのではなく、機能をその場でアプリケーションにプラグインするために使用したいと考えています。これがホスティングコードです...

using System;
using CSScriptLibrary;
using System.Reflection;
using System.IO;

namespace CSScriptTester
{
    class Program
    {
        static void Main(string[] args)
        {
            // http://www.csscript.net/
            Console.WriteLine("Running Script.");
            CSScript.Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(System.Windows.Forms.MessageBox)));
            string code = File.ReadAllText("SomeCode/MyScript.cs");
            dynamic block = CSScript.Evaluator.LoadCode(code);
            block.ExecuteAFunction();
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

そして、これが SomeCode/MyScript.cs の内容です...

using System;
using System.Windows.Forms;

namespace CSScriptTester.SomeCode
{
    class MyScript
    {
        public void ExecuteAFunction()
        {
            MessageBox.Show("Hello, world!");
        }
    }
}

これはうまくいきます。ホスティング コードでは、ホスティング コードにアセンブリ参照の指定を任せたくありません。コメントアウトしCSScript.Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(System.Windows.Forms.MessageBox)));て実行すると、エラーが発生します...

エラー CS0234: 型または名前空間名Forms' does not exist in the namespaceSystem.Windows'. アセンブリ参照がありませんか?

コマンドラインツールを使用してこれを実行していた場合、これをスクリプトの先頭に追加して参照を追加できます...

//css_reference System.Windows.Forms.dll

しかし、.NET アプリケーションのコンテキストで実行すると、それは無視されるようです。参照を適切に解決するにはどうすればよいですか?

4

3 に答える 3

3

理解した。

string code = File.ReadAllText("SomeCode/MyScript.cs");
CSScript.Evaluator.ReferenceAssembliesFromCode(code);       
dynamic block = CSScript.Evaluator.LoadCode(code);
block.ExecuteAFunction();

これが自動的に行われないことに驚いています。

于 2014-04-07T16:02:36.060 に答える
0

これを別の方法で解決しました。必要な参照アセンブリの "Copy Local" プロパティを true に設定し、スクリプトをロードする前にそれらを Eva​​luator にロードしました。

ロードされたアセンブリをプリコンパイルして保存し、スクリプトのアドホック ロードを高速化するため、これを行うことをお勧めします。スクリプトをロードするたびに GAC や他の場所から参照アセンブリを検索する代わりに、単純にアセンブリを取得して、できるだけ効率的にスクリプトをロードします。

CSScript.Evaluator.ReferenceAssembly("<local path to dependency>.dll");
IScript script = CSScript.Evaluator.LoadFile<IScript>("<local path to script file");

「依存関係へのローカル パス」は、プロジェクト内の参照アセンブリの「説明」文字列として見つけることができる参照オブジェクトの名前です。

于 2015-10-12T17:40:05.187 に答える