【问题标题】:Application .NET which compile code in Windows form以 Windows 形式编译代码的应用程序 .NET
【发布时间】:2020-04-09 09:08:47
【问题描述】:

我有问题。我在 .Net 中找不到允许我以 Windows 形式编译代码的机制。 我想要 1 个带有代码的文本框,稍后编译的代码显示在另一个框中。 我该怎么做?

【问题讨论】:

  • 显示编译后的代码是什么意思? Compiling C# code on runtime 很简单。但是不清楚编译后的代码是什么意思,生成的程序集的数组字节是什么意思?伊尔?试试 Sharplab.io,玩一下 Results 下拉菜单,有哪一个符合你的要求?

标签: c# .net compilation


【解决方案1】:

听起来您想在 Windows 窗体应用程序中使用 C# 编译器,但我不确定您的其他框会显示什么。

如果您只是在寻找编译和直观显示 IL,肯定有一些方法可以从 Windows 窗体调用 Roslyn。

如果您希望动态生成 GUI,您的选项就不太清楚了。我会考虑将您自己的包装函数暴露给另一种语言。我会考虑使用 Moonsharp 即时编译 Lua 代码。 IronPython 也可以。我不熟悉是否可以以类似方式调用 F# 语言服务,但我会考虑这些选项。

如果您特别希望编译 C# 并使用结果显示 WinForms GUI,则需要使用 CodeDOM。 CodeDOM 是一个相当深的兔子洞,即使它功能强大,并且将它呈现的任何 GUI 沙箱化到您心目中的输出容器中并不容易。

【讨论】:

    【解决方案2】:

    如前所述,使用 Roslyn 编译代码无疑是前进的方向。 如果您希望通过执行编译后的代码来查看一些输出,您可能希望创建一个用于脚本编写的抽象类,它提供了一个入口点和一种报告输出的方式。然后,您可以将脚本编译成 dll 并使用反射来加载输出程序集,实例化您的类的实例(实现下面的 ScriptTemplate 的类)并通过入口点执行。

    abstract class ScriptTemplate
    {
       public abstract void Main();
    
       public string Output
       {
          get;
          protected set;
       }
    
    }
    

    然后,您的表单可以将 Output 属性写入文本框。

    class Script : ScriptTemplate
    {
       public override void Main()
       {
          Output = "Hello world!";
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      相关资源
      最近更新 更多