簡単に言うと、再利用可能なスクリプト コードを含む 2 番目のスクリプトを、ホスト アプリケーションを再起動せずにスクリプトのいずれかが変更されたときにアンロードおよび再ロードできるようにする必要があるという制約の下で、どのように参照しますか?
2 番目の「ライブラリ」スクリプトからコンパイルされたばかりのアセンブリを参照しながら、CS-Script「サービスとしてのコンパイラ」(CSScript.Evaluator) を使用してスクリプト クラスをコンパイルしようとしています。その目的は、ライブラリ スクリプトに、さまざまなスクリプトで再利用できるコードを含めることです。
以下は、この考え方を示すサンプル コードですが、実行時に CompilerException も発生させます。
using CSScriptLibrary;
using NUnit.Framework;
[TestFixture]
public class ScriptReferencingTests
{
private const string LibraryScriptCode = @"
public class Helper
{
public static int AddOne(int x)
{
return x + 1;
}
}
";
private const string ScriptCode = @"
using System;
public class Script
{
public int SumAndAddOne(int a, int b)
{
return Helper.AddOne(a+b);
}
}
";
[Test]
public void CSScriptEvaluator_CanReferenceCompiledAssembly()
{
var libraryEvaluator = CSScript.Evaluator.CompileCode(LibraryScriptCode);
var libraryAssembly = libraryEvaluator.GetCompiledAssembly();
var evaluatorWithReference = CSScript.Evaluator.ReferenceAssembly(libraryAssembly);
dynamic scriptInstance = evaluatorWithReference.LoadCode(ScriptCode);
var result = scriptInstance.SumAndAddOne(1, 2);
Assert.That(result, Is.EqualTo(4));
}
}
コードを実行するには、NuGet パッケージの NUnit と cs-scriptが必要です。
この行により、実行時にCompilerExceptionが発生します。
dynamic scriptInstance = evaluatorWithReference.LoadCode(ScriptCode);
{interactive}(7,23): error CS0584: Internal compiler error: The invoked member is not supported in a dynamic assembly.
{interactive}(7,9): error CS0029: Cannot implicitly convert type '<fake$type>' to 'int'
繰り返しますが、 CSScript.LoadCodeの代わりに CSScript.Evaluator.LoadCodeを使用する理由は、いずれかのスクリプトが変更されたときに、ホスト アプリケーションを再起動せずにいつでもスクリプトを再ロードできるようにするためです。(CSScript.LoadCode は、 http://www.csscript.net/help/Importing_scripts.htmlに従って他のスクリプトを含めることを既にサポートしています)
CS-Script エバリュエーターに関するドキュメントは次のとおりです: http://www.csscript.net/help/evaluator.html
これに対する Google の結果がないことは残念ですが、何か単純なものが欠けていることを願っています。どんな助けでも大歓迎です。
(この質問は、存在しないタグ cs-script の下に提出する必要があります。)