简而言之,问题是:您如何引用包含可重用脚本代码的第二个脚本,在您需要能够在脚本中的任何一个更改而无需重新启动主机应用程序的情况下卸载和重新加载脚本的约束下?
我正在尝试使用 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.Evaluator.LoadCode而不是 CSScript.LoadCode 的原因是,当任一脚本发生更改时,可以随时重新加载脚本,而无需重新启动宿主应用程序。(根据http://www.csscript.net/help/Importing_scripts.html,CSScript.LoadCode已经支持包含其他脚本)
这是关于 CS-Script Evaluator 的文档:http ://www.csscript.net/help/evaluator.html
谷歌搜索结果的缺乏令人沮丧,但我希望我错过了一些简单的东西。任何帮助将不胜感激。
(这个问题应该在不存在的标签 cs-script 下提交。)