【问题标题】:How can I compile dynamic code at runtime in the current assembly?如何在当前程序集中在运行时编译动态代码?
【发布时间】:2015-09-20 14:42:39
【问题描述】:

我使用VBCodeProvider 编译代码,但它会生成一个新程序集,而且我需要添加对我需要使用的程序集的所有引用。

有没有办法在当前程序集中编译代码?

【问题讨论】:

  • 不,没有。你想做什么?你为什么用 C# 和 VB.NET 标记你的问题?
  • @Luaan:我需要多次编译代码,我不想每次都创建新程序集并添加所有引用,我只想在可能的情况下在当前程序集中编译。因为我可以接受 C# 和 VB.Net 的答案。
  • 如果它对 ASP.NET 来说已经足够好了,为什么对你来说还不够好呢?为什么你会关心“每次都添加所有引用”?当你这样做时,你想象会发生什么?
  • @Luaan:如果没有办法就好了。当然最好不要每次都生成新的程序集,我只是想知道。
  • “思考”在考虑性能影响时不会让您走得太远。我花了 5 分钟来编写一个测试项目,与编译本身相比,创建数千个单独的程序集需要很少的内存。一万个程序集占用不到 50 MiB(很难隔离 所有 不相关的内存使用,它可能远小于 50 MiB)。如果这对您来说太多了,您可以在构建新程序集时使用旧程序集并替换它,而不是一次将多个动态程序集保存在内存中,但在此之前可能还有很多需要改进的地方。

标签: .net vb.net dynamic-compilation vbcodeprovider


【解决方案1】:

VBCodeProvider 已过时。使用罗斯林。但这仍然不允许您在运行时修改现有程序集,因为这是不可能的。

编译并加载一个新程序集。您可以使用反射自动将引用列表添加到 Roslyn 编译。

【讨论】:

  • 我可以在 vs2013 或更低版本中使用 Roslyn 吗?
【解决方案2】:

您无法调整当前程序集。

几年前,我写过一篇关于动态编译的文章:http://emoreau.com/Entries/Articles/2011/07/Compiling-code-on-the-fly.aspx

顺便说一句,Roslyn 仅在您使用 VS2015 时可用(除非您使用可用于 VS2013 的 CTP,但对于其他任何测试都不是一个好主意)。

【讨论】:

  • 我用的是vs2013。我可以将 Roslyn 与 vs2013 一起使用吗?正如我所见,Roslyn 适用于 vs2015
  • Roslyn 是 VS2015 中的编译器,是的。但这并不意味着你不能在 VS2013 中使用 Roslyn SDK,它只是一个像其他任何东西一样的 nuget 包。
  • @Luaan:是的,我添加了 nuget 包,但没有 Roslyn.Compilers。我错过了什么吗?
  • @AramGevorgyan 有许多不同的包 - 你需要安装所有你需要的。
  • @Luaan 我为 .Net 编译器平台安装了 Microsoft.CodeAnalysis 和 CodeDOM 提供程序。我还需要什么吗? id没有提到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多