【问题标题】:Loading a script from a cs file and accessing host methods, properties etc?从 cs 文件加载脚本并访问主机方法、属性等?
【发布时间】:2012-04-12 05:48:22
【问题描述】:

我只是和 Roslyn 一起玩,但不确定如何执行以下操作。

为了简单起见,假设我有一个宿主程序,它有这样的方法

public void DisplayMessage(string message)
{
   MessageBox.Show(message);
}

然后我可以有一个名为 MyScript.csx 的脚本文件,然后在脚本的某个地方有类似的东西

void Main()
{
   Host.DisplayMessage("I am a script");
}

然后我让主机加载文件并执行它。

如果这种事情做不到,是否有基于 c# 的脚本系统/引擎可以做到? 这些是要求

  1. 主机应用程序可以从文件加载脚本。
  2. 脚本文件是用 c# 编写的,因此可以使用 VS2010 和语法等编写
  3. 脚本文件可以访问宿主的公共方法、属性等

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    我写了一个Introduction to the Roslyn scripting API,涵盖了您所问的大部分内容。 ScriptEngine 类型也有一个 ExecuteFile 方法,这对你正在尝试做的事情很有用。

    免责声明:我在 Microsoft 从事 Roslyn 项目。

    【讨论】:

      【解决方案2】:

      是的,您可以使用 Roslyn 为所欲为。

      首先,创建一个具有公共DisplayMessage 方法的公共Host 类(或使用现有类)。然后创建ScriptEngine,指定包含Host 的程序集作为引用。之后,您可以在文件上调用ExecuteFile(),并将Host 对象作为另一个参数:

      var engine = new ScriptEngine(references: new[] { typeof(Host).Assembly });
      engine.ExecuteFile("MyScript.csx", new Host());
      

      脚本文件不需要任何Main()方法,直接调用宿主对象上的方法:

      DisplayMessage("I am a script");
      

      【讨论】:

      • 好的 @svick 只是在写 DisplayMessage("I am a script");不起作用,那么您如何实际访问主机的属性?我尝试将 #r "C:\MyScriptTest.exe" (执行脚本的程序集)添加到脚本的顶部并执行以下 TestApp.MainWindow.DisplayMessage("I am a script");但我得到“不包含'DisplayMessage'的定义”错误
      • 你真的不需要以任何方式引用它,你应该可以像我写的那样调用它。您确定将Host 的实例传递给ExecuteFile() 方法并且您要调用的方法是public
      • 好的好的@svick 我想我在这里赶上。我假设为了编写脚本,脚本需要知道主机是什么以及它有什么方法、属性等。我在 VS 中编写脚本,每次我写一些东西时,我在方法和属性下都有红线,所以我假设我有语法错误或什么的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2021-03-06
      • 2021-10-12
      • 1970-01-01
      • 2013-09-04
      • 2011-07-07
      相关资源
      最近更新 更多