在c#、winforms中如何在运行时编译中传递参数?

发布于 2024-10-31 22:38:31 字数 1198 浏览 6 评论 0原文

我陷入了运行时编译和 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 文件。

I'm stuck on run-time compilation and CodeDom.
Here's a simplified example of what I have so far.

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);

    }

It works perfectly alright, and loads the Test form.

But! I need to pass a parameter to this Test form (a list of Panel controls) to populate the form.

How can I do this? Maybe, I am looking in the wrong direction, and it has to be done in a different way?
Thanks a lot in advance!

EDIT
In the end, I give up on CodeDom and used Mono.Cecil instead, injecting .exe file with information from my main program.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

默嘫て 2024-11-07 22:38:31

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

如果您想传递信息,命令行参数是一种选择。但是,在命令行上传递 .Net 对象将不起作用。

如果你想传递一些托管的东西,你将不得不使用你的新程序集和一些后期绑定 并将您的对象传递给构造函数,这可能取决于您正在编译的代码接受的内容(如果您在设计时有的话)...

您是否正在重写 Visual Studio?

What you are doing is compiling an executable assembly then starting it in another process.

If you want to pass it information, command line arguments are one option. However, passing a .Net object on the command line will not work.

If you want to pass somthing managed you will have to use your new assembly with some late binding and pass your object to the constructor perhaps, rather depends what the code you are compiling accepts, if you have that at design time ...

Are you re-writing Visual Studio?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文