【问题标题】:How do I pass parameters in run-time compilation in c#, winforms?如何在c#、winforms的运行时编译中传递参数?
【发布时间】:2023-03-10 15:24:02
【问题描述】:

我被运行时编译和 CodeDom 困住了。 这是我目前所拥有的一个简化示例。

public static void Testing()
    {
        CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
        string Output = "Out.exe";

        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();

        parameters.GenerateExecutable = true;
        parameters.OutputAssembly = Output;
        parameters.ReferencedAssemblies.Add("System.dll");
        parameters.ReferencedAssemblies.Add("System.Drawing.Dll");
        parameters.ReferencedAssemblies.Add("System.Windows.Forms.Dll");
        parameters.CompilerOptions = "/t:winexe";

        string[] text = new string[] { @"C:\MyProject\Test.cs", @"C:\MyProject\Test.Designer.cs",
        @"C:\MyProject\Program.cs"};

        CompilerResults results = codeProvider.CompileAssemblyFromFile(parameters, text);

        Process.Start(Output);

    }

它工作得很好,并加载了测试表单。

但是!我需要将参数传递给此测试表单(面板控件列表)以填充表单。

我该怎么做?也许,我看错了方向,必须以不同的方式完成? 提前非常感谢!

编辑 最后,我放弃了 CodeDom,转而使用Mono.Cecil,将主程序中的信息注入 .exe 文件。

【问题讨论】:

  • 也许您可以将该参数作为命令行参数传递并在子应用程序中处理它?
  • @khachik 谢谢你的回答!您能否提供更多关于如何在动态编译中将参数传递给命令行的信息?
  • 您能解释一下您的要求吗?我不太清楚。
  • @Subhash Lama 很快,我需要实现以下目标。用户应该有可能首先用各种东西填充面板控件列表,然后创建一个 .exe 文件,其中包含这个带有面板的测试表单。因此,我需要将面板列表传递给要即时编译的类。
  • 接近。首先创建一个示例 Winforms 项目来执行此操作。只有这样你才能知道要生成什么代码。

标签: c# winforms codedom runtime-compilation


【解决方案1】:

您正在做的是编译一个可执行程序集,然后在另一个进程中启动它。

如果你想传递信息,command line arguments are one option。但是,在命令行上传递 .Net 对象将不起作用。

如果你想传递托管的东西,你将不得不使用带有一些late binding 的新程序集并将你的对象传递给构造函数,而不是取决于你正在编译的代码接受什么,如果你在设计时有的话。 ..

你在重写 Visual Studio 吗?

【讨论】:

  • 感谢您的回答!对于我想要实现的这么简单的事情来说,这一切似乎有点太复杂了。上面我试图在对 Subhash Lama 的评论中解释我在做什么。
猜你喜欢
  • 2014-05-13
  • 2014-06-26
  • 2016-02-23
  • 2011-08-02
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
相关资源
最近更新 更多