问题标签 [dynamic-compilation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
522 浏览

ocaml - 用于检查 OCaml 代码是否编译的 OCaml 程序

我想编写一个 OCaml 模块,该模块具有一个compile函数,该函数将接受一个包含 OCaml 程序的字符串,并将编译结果输出为正确或错误,在错误情况下,输出有关第一个错误的行和字符的信息。我不在乎错误是什么(至少现在是这样)。

一个基本的模块类型是:

至少有两种根本不同的方式来实现它:

  1. 快速破解方式——将字符串与程序一起写入文件,使用 Unix 进程ocamlc在命令行上调用并解析 stderr;
  2. 正确的方法——使用 OCaml 工具来分析代码。

关于(1),我无法掌握 stderr 的内容。我开始使用 Unix.open_process_in,它将标准输出重定向到一个 in_channel ,然后我可以读取它。由于ocamlcgo to stderr (而不是 stdout) 输出的编译错误,我尝试使用

以便 stderr 的内容在命令行被重定向到 stdout。我希望ic 这样可以包含编译错误。不幸的是,情况并非如此,ic仅包含End_of_file.

然后我转到Unix.create_process命令,因为它允许我为 out、in、err 选择新通道。但是我在选择这些频道时遇到了麻烦。输出通道应该是什么,以便我可以在我的程序中读取它?

关于(2),您认为(合理)简单的方法是什么?

非常感谢您的帮助!

0 投票
0 回答
465 浏览

c# - 跨 appdomains 共享数据,在双方及其他地方运行 linq 查询

从一开始,我正在开发一个实用程序来解析和审查来自第三方应用程序的日志,并明确要求极高的灵活性。

为了实现这一点,我正在充分发挥 LINQ 的潜力(可能还不止于此:/)。

由于用户应该通过实用程序的 UI 构建自己的查询,因此我需要能够动态加载和卸载它们。为此,我正在使用一个方法(字面意思为“DoStuff”)构建虚拟类,该方法返回查询结果(通常基于 LINQ,但可能存在例外),将它们(通过 CSharpCodeProvider)编译为临时程序集,将它们加载到“一次性”AppDomain 上,运行查询,然后摆脱 AppDomain 和程序集。

这就是警报触发的地方:LINQ + AppDomains = 很多出现问题的机会。

更糟糕的是,要确定每个域上将运行什么以及跨越(或试图跨越)域边界的内容可能会变得非常棘手。我希望 stackoverflow 中的知识库可以帮助解决这个问题。

因此,深入细节,这是我所拥有的简化版本:

在主程序集(实用程序的实际 .exe 文件)上,它只会由执行它的用户以“正常方式”加载,我有类似这样的东西:

(除了一些形式,样板启动代码等)。该程序将要求用户提供一组日志文件(使用 FileOpenDialogs、支持带有经典“*”和“?”通配符的文件名模式的文本字段等),并使用它们来初始化 LogData 的单个实例.

之后,用户会看到一个闪亮的 GUI 来构建和微调查询,包括一个 Doom's Day 按钮来运行查询。这就是乐趣的开始。这个想法是生成代码来表示用户的查询,然后将其包装成这样的东西(我在这里省略了“使用”语句和其他内容):

然后将其提供给 CSharpCodeProvider 以将其(使用预定义的、可配置的引用列表)编译为临时程序集。然后我将程序集加载到“丢弃”AppDomain,创建“whatever”实例,调用它的 DoStuff 方法(将我的 LogData 实例传递给它),检索结果,卸载域,并摆脱组件。

现在,幕后会发生什么?这才是真正的问题^^。跟踪每个域上运行的代码以及在它们之间来回反弹的数据是相当棘手的。经过一些研究,我正在做出一些有根据的猜测,所以如果有人能告诉我我是否猜对了就足够了:

1,LogData 必须从 MarshalByRefObject 继承,因此当它传递给用户的查询 (DoStuff) 时,枚举器仍然在“默认”应用程序域上执行并且一切正常。

2,) 上面的意思是,没有任何 LogData 实例跨越 AppDomain 边界(对其成员的调用是另一回事),但它的条目(LogEntry 实例)在从 DoStuff 迭代日志时会发生。那么,那些应该是可序列化的吗?它们根本不难反序列化,尽管我觉得这就像将解析工作加倍。将它们改为 MarshalByRefObject 后代会起作用吗?

3,无论DoStuff返回什么,都需要复制,而不是引用,所以在卸载“扔掉”后仍然可以从主AppDomain使用它。因此,查询可能包含在其结果中的任何类型都需要可序列化,而不是 MarshalByRefObject。

4,即使 DoStuff 返回一个 LINQ 查询(类似于“从输入中的条目返回...”),查询的枚举器也将仅在“丢弃”域上运行,并且仅在单个项目(其中,在上面一点,我已经说过那些无论如何都应该是可序列化的)实际上会跨越域边界。

这些结论对吗?我错过了什么吗?

提前感谢您的任何回答。

PS:基于丹尼尔在下面的评论,我想我必须对项目的某些方面进行更深入的了解:

  1. 虽然“查询构建器”旨在成为定义查询的主要机制,但该程序还将让用户在构建器不够用时引入原始代码(以及对于那些对编程足够熟悉而更愿意键入一些代码的用户)围绕下拉菜单、菜单和其他花哨的东西导航的代码;这恰好是项目目标受众的重要组成部分)。

  2. 我没有提到的另一个功能是它可以保存查询以供以后使用。对于由 C# 代码表示的查询,持久化它们是微不足道的(在编译之前,它们只是字符串)。持久化的表达式树(或任何类似的东西)很快就会变成一个大障碍。

  3. 这不是我第一次潜入CodeProvider课堂。动态加载程序集;也不是 LINQ。但这可能是我第一次如此深入地研究这个;绝对是我第一次尝试将所有这些放在一起。我熟悉这些功能中的每一个的潜力,并且相当有信心,一旦理清了有关它们交互的棘手细节,我正在尝试的事情将相对容易。这个问题只是关于那些细节,我可以从那里处理其他所有事情。

0 投票
1 回答
997 浏览

java - 如何在 Google App Engine 中动态编译 Java 类

在回答这个问题时,我了解到不可能javax.tools从 GAE 应用程序中调用 Java 编译器。

  • 这个限制是否仍然适用?

  • 如果是这样,我有哪些选项可以“即时”将 Java 源代码编译为可加载的类文件?

0 投票
1 回答
703 浏览

c# - visual studio 2010 c# winforms 运行时编译

我有以下问题,将尝试尽快描述它。

在我的程序中,可以通过单击按钮将 winform 编译为 .exe。

现在我尝试用 CodeDom 来做,所以在我的程序中我有以下行:

其中codeProvider是 CodeDomProvider,而text是编译源。

问题是我需要保存为 .exe 的 winform 后面有一个使用其他类和表单的类,并且,由于参数“文本”是一个字符串参数,它必须包含所有这些类,这会导致大量代码,更不用说很多错误了。是我的意思的一个例子。

肯定有其他方法,问题是,它们是什么?提前致谢!

0 投票
1 回答
284 浏览

java - 使用JDK6动态编译src但切换到JDK环境后仍然从ToolProvider.getSystemJavaCompiler()得到null;

我正在使用 JDK6 从 UI 编译输入 src 并立即运行。

但问题是,默认情况下我的应用程序使用的是 jre 而不是 jdk,所以:

总是返回空值;

而且我注意到在每台服务器上也安装了 JDK6,所以我写这个是为了解决这个问题:

但它没有用,可能java环境不会立即更改为我刚刚设置的那个地方,它仍然得到了null对象。

所以,我的问题是如何将 jre 环境切换到 jdk 并使其立即生效,我们可以获得 JavaCompiler 对象?

谢谢。

0 投票
1 回答
4758 浏览

winforms - 命名空间“System.Drawing”中不存在“矩形”

使用 .NET 2.0。

System.Drawing在我的参考文献列表中。

这是我的using声明:

这是代码:

这是这一行的错误:

错误文本:命名空间“System.Drawing”中不存在类型或命名空间名称“矩形”(您是否缺少程序集引用?)

为什么?

编辑:添加编译代码:

所有其他 ReferencedAssemblies 都可以工作并且已经工作了很长时间。这是我第一次遇到这样的错误。

我已确保并仔细检查了引用是否已添加。如果我再次尝试将其添加到项目中,我会收到一条消息,指出该引用已存在。

谢谢

0 投票
1 回答
2766 浏览

c# - 删除 CodeDomProvider 编译创建的程序集时访问被拒绝?

如果在编译完成后在 .NET 中使用 CodeDomProvider 类,则无法删除输出程序集。我希望能够删除输出程序集。File.Delete 返回拒绝访问异常。

编辑作为一种解决方法,我在类上使用静态构造函数来搜索临时文件夹并删除以前创建的程序集。

0 投票
2 回答
441 浏览

c# - 运行时的 C# 代码?

如何在运行时编译原始 C# 代码?因此,如果我想通过删除重要的代码片段并通过服务器下载它来增加安全性,然后从我的应用程序中执行它?

0 投票
1 回答
164 浏览

c# - 是否有任何 AppDomain/“动态编译代码”限制?

我打算编写一个游戏,用户必须编写自己的 C# 代码才能玩它。由于我不能信任用户提交的代码,我想为每个用户创建一个 AppDomain。每个用户都可以编写几个类,所以我需要动态编译和实例化每个类。其中一些类将有多个实例。

我不想限制用户数量,但可以说注册了几百个用户。这意味着我需要几百个 AppDomain,并且我正在编译/实例化更多的用户代码类。

在达到前面提到的用户数量之前,我是否会更早地达到任何限制?(CPU/内存)

0 投票
2 回答
969 浏览

c# - C# 脚本和安全性

在我的游戏(也是用 C# 编写的)中,我想包含某种自定义支持。速度是一个很大的问题,因为我计划将游戏的主要部分卸载到脚本中。因此,我选择使用 C# 编写游戏内事件和内容的脚本。用户还应该能够使用 C# 为游戏编写脚本和插件。(我知道 C# 不是脚本语言。)

我将为用户提供一个(静态)类,其中包含与游戏交互所需的所有功能。用户还可以提供代码作为源代码(在这种情况下游戏将编译它)。 在某些情况下,编译的用户“脚本”可以/也可以传输给其他玩家。例如,用户可以在家中或其他任何地方构建脚本陷阱。

以下是我的问题:

  1. 安全

    如何确保提供的代码被迫只调用提供的 API(类)的东西?为了防止脚本作弊,恶意活动......

    有没有办法在某种 VM 或低信任环境中运行已编译的代码?

  2. 速度

    这种方法是否足够快?(每隔一帧或每隔一帧调用多达 100 个自定义程序集的函数)。对此有什么建议吗?

    也许可以通过将所有用户内容编译成一个大程序集或其他什么来获得速度优势?

  3. 尺寸

    我怎样才能使编译后的代码变小(除了压缩它)?因为玩家可能需要下载数十个脚本......

    有没有办法去除不是绝对​​必要的东西?像调试信息或类名之类的......

运行时编译对我来说相当新(这就是我在这里问的原因)。因此,指出一些主要的初学者错误和/或安全问题会很好。

编辑:

只是为了澄清:用户插件/脚本或任何你想调用的东西都是一个类(也是用 C# 编写的),它必须实现特定的功能,如“GetAddonInfo”、“Init”、“Update”......就像一个从我的抽象“插件”类派生的普通 C# 类。