2011-04-14 42 views
0

我被困在運行時編譯和CodeDom。 下面是我迄今爲止的一個簡單例子。如何在c#,winforms的運行時編譯中傳遞參數?

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

    } 

它工作完全正常,並加載測試表單。

但是!我需要將一個參數傳遞給此測試表單(一個Panel控件列表)以填充表單。

我該怎麼做?也許,我看着錯誤的方向,它必須以不同的方式完成? 非常感謝!

編輯 最後,我放棄的CodeDOM和使用Mono.Cecil代替,注入.exe文件從我的主節目信息。

+2

也許你可以傳遞該參數作爲命令行參數,並在子應用程序中處理它? – khachik 2011-04-14 12:27:52

+0

@khachik謝謝你的回答!請您提供更多關於如何在動態編譯中將參數傳遞給命令行的信息? – 2011-04-14 12:41:04

+0

你能解釋你的要求嗎?我不清楚。 – 2011-04-14 12:53:05

回答

2

你正在做的是編譯一個可執行程序集,然後在另一個進程中啓動它。

如果你想通過它的信息,command line arguments are one option。但是,在命令行上傳遞.Net對象將不起作用。

如果你想傳遞管理的東西,你將不得不使用你的新程序集與一些late binding,並將你的對象傳遞給構造函數,而不是取決於你正在編譯的代碼接受什麼,如果你在設計時有。

您是否正在重寫Visual Studio?

+0

感謝您的回答!對於我試圖實現的這麼簡單的事情,這一切似乎都有些複雜。上面我試着解釋我在對Subhash Lama的評論中做了什麼。 – 2011-04-14 13:06:32

相關問題