问题标签 [runtime-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 投票
1 回答
1569 浏览

c# - 从内存中的文件编译 c# 代码

我想将我的代码从文件直接编译到内存中(Runtime-CompilationRunPE 方法)。

这是我使用的代码:

这将使我在调试中没有错误,但也无法正常工作。只是在调试输出时我看到了这个:

加载“3kp0asrw”。模块是在没有符号的情况下构建的。

其他的看起来还不错。

这是code.txt文件中的代码,假设只需编写 3 行文本并在控制台中显示一条消息:

问题:我在这里缺少什么?您是否知道直接在内存中从文件或源代码运行代码的任何其他方法(AKA RunPE 方法)?你能给我一个简单的例子吗?

注意:我想为更大的代码执行此操作并将其自动化以供以后使用,就像 .net crypters 在存根文件中所做的那样,无需每次都指定类名和...。可能吗?

0 投票
0 回答
83 浏览

vb.net - 发布动态编译VB代码

当我使用CodeDom编译 VB 代码时,我不需要为系统引用指定完全限定的路径。例如:

按预期工作。

但是当我使用 roslyn 做同样的事情时,它期望我给出一个完全合格的路径。例如:

正在引发异常。

我无法弄清楚 Codedom 如何获得系统引用的完全限定路径。

0 投票
0 回答
132 浏览

vb.net - 使用带有 roslyn 的“My.Computer”的问题

我正在尝试使用 Roslyn 编译 VB 代码。一些文件使用我的参考,例如:

编译代码时出现错误:

错误 BC30456:“计算机”不是“我”的成员。

我不确定我错过了什么。我确实创建了一个MetaDataReferenceto Microsoft.VisualBasic.dll

0 投票
0 回答
182 浏览

vb.net - Roslyn 比 CodeDom 慢

我正在使用 Roslyn 使用磁盘上的许多 VB 文件生成运行时 dll。我首先从所有这些文件创建语法树,然后使用它们来创建 VBCompilation 并发出程序集。整个过程大约需要 10 分钟。创建语法树占用了很大一部分时间。如果我使用 CodeDom 编译文件,大约需要 3 分钟。有没有办法让 Roslyn 更快地编译文件?

0 投票
1 回答
189 浏览

c# - 从 Roslyn 编译中获取特定于文化的错误

我正在尝试使用Roslyn Emit Api 编译一些语法不正确的代码。编译代码的线程将 Culture 设置为“fr-Fr”,但我从 Roslyn api 获得的诊断消息是英文的。例如

错误 BC30037:字符无效。

我想知道是否有办法在线程特定的文化中获取错误消息。codeDom 也是如此。

0 投票
0 回答
411 浏览

roslyn - 使用 Roslyn 在运行时编译多个程序集

我正在尝试在运行时创建多个程序集。我正在使用 Roslyn 串行编译每个程序集。

我无法利用多线程,因为 Roslyn 在内部使用多线程来编译单个 dll。使用 Roslyn 编译单个 dll 的时间比使用 CodeDom 的要少,但是由于使用 CodeDom 我可以并行编译多个 dll,因此 CodeDom 的实际时间要少得多。

我尝试将 Roslyn 编译的并发构建选项设置为 false,然后在我的代码中使用多线程,但这也效率不高,因为现在单个 dll 的编译时间更长。我想知道是否有解决此问题的方法

时序分析更新:

我有一个 8 核处理器。我在磁盘上有不同的文件集用于编译 72 个 dll。

在第一种情况下,我从文件创建语法树,创建引用,创建选项并使用 Emit 使用简单foreach循环以串行方式为每个 dll 编译 dll。总耗时 488589 ms

在第二种情况下,我使用parallel.ForEachwithMaxDegreeOfParallelism = 7并创建语法树、创建引用、创建选项并在循环中使用 Emit 编译 dll。总耗时 514481 ms

在这两种情况下,并发构建选项都是默认的:True。

如您所见,使用多线程时没有观察到任何收益。

0 投票
1 回答
143 浏览

java - 如何在调用 .class 文件时在运行时提供外部 jar

我试图在运行时在 eclipse 中编译和运行一个 java 类,它使用一个外部 jar 示例:在这种情况下是 JSON 库。

我已经成功编译了 java 代码,但是当我尝试调用该方法时,它给了我以下错误java.lang.reflect.InvocationTargetException

当我将所需的 jar 添加到 eclipse 的构建路径时,它工作正常。我不想将 jar 添加到 eclipse 的 buildPath,因为它需要从外部路径加载 jar 以及构建eclipse中提供的路径。

在运行时在 JAVACompiler 中调用包含外部 jar 的类时,有什么方法可以添加外部 jar 路径?

请在这个问题上帮助我。

这是要在运行时编译和运行的具有外部 jar 的类。

这是我正在运行以编译 JSONPRINTERCLASS 的类

最后是@AL4建议的更改后的代码

但我仍然得到

java.lang.Error:未解决的编译问题:JSONArray 无法解析为类型 JSONArray 无法解析为类型 JSONObject 无法解析为类型 JSONObject 无法解析为 JSONPRINTERCLASS.printJson(JSONPRINTERCLASS.java:20) 处的类型JSONPRINTERCLASS.(JSONPRINTERCLASS.java:7) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 java.lang.Class.newInstance(Class.java:442) 在 StackInLineCompiler.main(StackInLineCompiler.java:137)

请帮忙

0 投票
1 回答
1214 浏览

c# - 使用 Roslyn 解析运行时生成类型的 lambda 表达式

我正在尝试使用 Roslyn 作为解析用户在运行时使用通用格式提供的 lambda 表达式的一种方式:

然后调用者提供code类似P => P.Property > 5. 当我为 T 使用众所周知的类型时,这一切都很好,但我希望允许用户使用更多动态类型,每个用户都可以定义自己的一组属性(带有类型)。同步表达式树不支持动态类型(因此 Roslyn 不能这样编译),我希望允许用户定义他们的属性并且我会动态生成运行时类型。

我遇到的问题是,在创建运行时类型之后,我没有用于Tin的具体类型.ContinueWith<Expression<Func<T,bool>>>

我已经使用完整的反射做类似的事情:

但这会引发异常:

Microsoft.CodeAnalysis.Scripting.CompilationErrorException:错误 CS0400:类型或命名空间名称 'System.Linq.Expressions.Expression 1[[System.Func2[[Submission#1+Person,ℛ*907cf320-d303-4781-926e-cee8bf1d3aaf#2-1,版本=0.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken =b77a5c561934e089]], System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 在全局命名空间中找不到(您是否缺少程序集引用?)

在这种情况下,Person运行时类型的名称在哪里(我认为它在抱怨什么)。

我已经尝试将类型所在的程序集显式添加到ScriptOptions使用中:

但这失败了:

System.NotSupportedException:无法创建对没有位置的程序集的元数据引用。

我正在尝试做的事情可能吗?

0 投票
1 回答
1718 浏览

c# - C# - 从用户输入字符串动态创建函数体

我正在尝试创建一个 C# 程序,让用户通过在文本框中输入文本来为函数提供实现。我提供了函数头(输入类型,输出类型),他们只需要提供实际的实现。然后我存储该函数以供以后调用。他们可能需要从 .NET 框架导入一些东西,但在它之外什么都不需要。

我不关心安全性,这只是供内部使用的工具。

在 .NET 中是否有一种简单的方法可以做到这一点?

用法看起来像(需要实现 CompileUserFunction 函数,该函数接受一个 int 并返回一个对象):

0 投票
1 回答
545 浏览

c++ - C++ 让程序自己改写

几天前(和几年前)我发布了一个关于类似主题的问题,但我决定继续开始。我正在尝试将 C++ 代码注入 C++ 代码(以某种可移植的方式,不使用操作系统特定的功能,并尝试以独立于编译器/工具链的方式)。我基本上想这样做是为了尝试执行运行时 C++ 脚本。我写了一个小测试程序(它真的有点拼凑和hacky):Main.cpp:

源.cpp:

基本上我试着用 malloc 和 new 分配一大块内存,但我想也许我可以覆盖已经专用于进程内存的内存(这就是为什么我有cmpp指向的函数测试并尝试覆盖它)。但是我收到写访问错误。我看了一下这篇文章,从其中一个答案看来,可以在没有访问冲突的情况下覆盖程序自己的内存(这是我想要做的),错误不少。有人可以详细说明一下,并告诉我如何在使用任何非标准功能(或至少一个可以/被抽象掉的功能)的情况下以某种可移植的方式做到这一点吗?