【问题标题】:fsi.exe Assembly: Anyone know how to embed it?fsi.exe 程序集:有人知道如何嵌入它吗?
【发布时间】:2011-01-09 01:26:26
【问题描述】:

长期读者,第一个问题。 fsi.exe 是一个 .NET 可执行文件,因此包含它自己的程序集,其中包含所有美味的方法和 fsi 用来执行 F# 脚本的东西。

查看 .NET Reflector 中的程序集(选择你的类,但 Shell 是最好的例子)揭示了一堆看起来像修饰的 C++ 函数的垃圾*名称(例如,来自 Dependency Walker)。顺便说一句,有点题外话,F# 程序集以几乎相同的方式编译,有很多垃圾*名称,这让我认为 fsi.exe 是用 F# 编写的,也许是作为可用性证明?

无论如何,这是我的问题:有没有人研究过 fsi.exe 并想出了如何将它嵌入到 .NET 应用程序中?因为我想使用 F# 作为脚本语言,但是程序编译为(惊喜)程序,并且脚本必须由 fsi.exe 执行,这在我的域中是不可接受的(我需要一个持久的 VM)。我不希望获得有关使用 fsi.exe 的操作指南,但我很想知道是否有人玩过它,如果有,您对它的工作原理有何发现?

感谢您的宝贵时间。

* 一目了然的垃圾。显然,出于某种特殊原因,它们以这种特殊方式格式化。

【问题讨论】:

  • 所以基本上,你想要eval
  • 我有点想知道,F# 的许可证是否允许首先嵌入 fsi?
  • @Juliet:为什么会是许可问题?
  • 不再是,它是开源的,没有 Apache 许可证。哪个是解决方案,你可以使用源嵌入它。
  • @Martinho:不,我想要一个脚本引擎。

标签: .net f# assemblies embed scripting-language


【解决方案1】:

据我所知,fsi.exe 没有公开任何可用于将其嵌入到应用程序中的 API(例如,用于实现脚本)。我认为基本上有两种选择:

  • 如果您想直接使用现有的fsi.exe,唯一的方法是使用.NET Process 类启动它并以某种方式与之通信。这应该是可行的——您可以使用标准输入向进程发送命令。要读回输出,您可以使用标准输出,但这只能提供有限的信息。可能可以使用 .NET Remoting 在fsi.exe 和您的应用程序之间进行通信(例如,在 FSI 的脚本上下文中加载的对象将通过 Remoting 向您的应用程序发送信息)。

  • 另一种选择是使用 F# 的 open-source release 并修改 fsi.exe 以将您需要的所有信息作为 API 公开。这需要更多的努力才能了解fsi.exe 的工作原理,但它应该是可行的。您可能不需要那么多添加 - FSI 维护的状态包含诸如全局变量之类的东西。

关于许可证 - 您可能无法使用随 Visual Studio 分发的fsi.exe。我不确定 CTP 版本附带的 fsi.exe。从源代码编译它(可用here)肯定没问题(因为它有开源版本)。

【讨论】:

  • 感谢您的意见,托马斯。看了 F# 电源包后,我确实看到它是用 F# 编写的,这很讽刺。我正在研究源代码。这可能对我来说太先进了,无法适应,但它仍然很有趣。我很想评价你的综合反应,但我没有代表。
  • 是否有可能以某种方式将其嵌入到另一个 AppDomain 中?这样你就不会有另一个 .net 进程的开销,并且可能更容易在架构上进行管理。
  • @ashley - 不幸的是,目前它必须作为一个单独的进程启动。
  • 谢谢 Tomas,您知道是否有计划进行此更改?这将让我不必更改 FSI 源代码并重新编译
  • 关于 F# 中 eval 状态的任何更新?除了在单独的进程中运行之外还有什么新的可能性吗?
【解决方案2】:
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多