[英]Is there any way to use the 2005 C# compiler in Visual Studio 2008?
[英]How to Integrate C++ compiler in Visual Studio 2008
有人可以幫我解決這個問題嗎?
我目前正在為我的榮譽學位課程的最后一年工作。 我們正在開發一個應用程序,以評估學生的編程作業(一年級學生水平)
我只想知道如何使用C#代碼集成C ++編譯器來編譯C ++代碼。
在我們的例子中,我們將一個學生C ++代碼加載到文本區域中,然后單擊按鈕以編譯該代碼。 如果有任何編譯錯誤,它將顯示在附近的文本區域中。 (接口隨附於此。)
最后,如果沒有任何編譯錯誤,它可以執行代碼。 結果將顯示在控制台中。
我們能夠使用內置編譯器使用C#(將C#代碼加載到C ++代碼的文本區域)代碼做到這一點。 但是仍然不能為C#代碼做。
有人可以建議一種方法嗎? 是否可以將外部編譯器集成到VS C#代碼? 如果可能的話如何實現呢?
非常感謝有人為解決這個問題做出貢獻嗎?
這是“構建”按鈕的代碼,我們繼續進行C#代碼編譯
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider(“ csharp”); 字符串輸出=“ Out.exe”; Button ButtonObject =(按鈕)發送器;
rtbresult.Text = "";
System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
//Make sure we generate an EXE, not a DLL
parameters.GenerateExecutable = true;
parameters.OutputAssembly = Output;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, rtbcode.Text);
if (results.Errors.Count > 0)
{
rtbresult.ForeColor = Color.Red;
foreach (CompilerError CompErr in results.Errors)
{
rtbresult.Text = rtbresult.Text +
"Line number " + CompErr.Line +
", Error Number: " + CompErr.ErrorNumber +
", '" + CompErr.ErrorText + ";" +
Environment.NewLine + Environment.NewLine;
}
}
else
{
//Successful Compile
rtbresult.ForeColor = Color.Blue;
rtbresult.Text = "Success!";
//If we clicked run then launch our EXE
if (ButtonObject.Text == "Run") Process.Start(Output); // Run button
}
遺憾的是,CodeDom for C ++沒有默認實現,如果您想使用與上述相同的代碼來編譯C ++,則可以始終定義自己的實現。
或者,您可以直接調用cl.exe,在這兩種情況下,您都必須手動調用cl.exe
http://msdn.microsoft.com/en-us/library/19z1t1wy(v=VS.71).aspx
它不應該那么難。 將代碼編寫到臨時文件中,調用cl.exe將所有輸出通過管道傳遞到想要(或不希望)的窗口並結束,檢查是否已生成exe,是否編譯成功,並且可以運行exe。失敗,該錯誤應該在您先前創建的日志中。
它的結構比上面的要少,但這是最簡單的方法。
-更詳細
以下代碼假定您的環境變量正確設置。 http://msdn.microsoft.com/en-us/library/f2ccy3wt(VS.80).aspx
class CL
{
private const string clexe = @"cl.exe";
private const string exe = "Test.exe", file = "test.cpp";
private string args;
public CL(String[] args)
{
this.args = String.Join(" ", args);
this.args += (args.Length > 0 ? " " : "") + "/Fe" + exe + " " + file;
}
public Boolean Compile(String content, ref string errors)
{
//remove any old copies
if (File.Exists(exe))
File.Delete(exe);
if(File.Exists(file))
File.Delete(file);
File.WriteAllText(file, content);
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.FileName = clexe;
proc.StartInfo.Arguments = this.args;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
//errors += proc.StandardError.ReadToEnd();
errors += proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
bool success = File.Exists(exe);
return success;
}
}
這將編譯提供給它的代碼,但這只是一個示例,每次編譯成功都會有一個文件“ Test.exe”可以運行。 當失敗時,“錯誤”變量將包含錯誤消息。
希望這對更多有關正在運行的進程的信息有所幫助,請訪問http://www.codeproject.com/KB/cs/ProcessStartDemo.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.