簡體   English   中英

如何在Visual Studio 2008中集成C ++編譯器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM