如何使用 C# 编译 C++ 代码。需要开发 C++ IDE [关闭]

Posted

技术标签:

【中文标题】如何使用 C# 编译 C++ 代码。需要开发 C++ IDE [关闭]【英文标题】:How to compile C++ code using C#. Need to develop a C++ IDE [closed] 【发布时间】:2014-05-08 13:26:50 【问题描述】:

我对开发 C++ IDE 很感兴趣,但为了方便和更好的 UI,我想使用 C# 开发 IDE。但是我遇到了一个问题,我找不到如何使用 C# 编译 C++ 代码并构建使用我的 IDE 编译的 C++ 程序的“.exe”。任何人都可以建议我是否有任何 API 或库可以构建我提供输入的任何 C++ 代码的“.exe”。

我能够编译和构建 C# 代码,但是如果有一种方法可以将 c++ 编译器功能集成到我的应用程序中,任何人都可以帮助我。 我需要的是类似于 CSharpCodeProvider 但用于编译 C++ 代码的东西。

我正在为 C# 编译做的是在下面的代码中。

class Compiler

    public static bool CompileFromSource(string source, string Output, string Icon = null, string[] Resources = null)
    
        // We declare the new compiler parameters variable
        // that will contain all settings for the compilation.
        CompilerParameters CParams = new CompilerParameters();

        // We want an executable file on disk.
        CParams.GenerateExecutable = true;
        // This is where the compiled file will be saved into.
        CParams.OutputAssembly = Output;

        // We need these compiler options, we will use code optimization,
        // compile as a x86 process and our target is a windows form.
        // The unsafe keyword is used because the stub contains pointers and
        // unsafe blocks of code.
        string options = "/optimize+ /platform:x86 /target:winexe /unsafe";
        // If the icon is not null (as we initialize it), add the corresponding option.
        if (Icon != null)
            options += " /win32icon:\"" + Icon + "\"";

        // Set the options.
        CParams.CompilerOptions = options;
        // We don't care about warnings, we don't need them to show as errors.
        CParams.TreatWarningsAsErrors = false;

        // Add the references to the libraries we use so we can have access
        // to their namespaces.
        CParams.ReferencedAssemblies.Add("System.dll");
        CParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
        CParams.ReferencedAssemblies.Add("System.Drawing.dll");
        CParams.ReferencedAssemblies.Add("System.Data.dll");
        CParams.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");

        // Check if the user specified any resource files.
        // If yes, add then to the stub's resources.
        if (Resources != null && Resources.Length > 0)
        
            // Loop through all resource files specified in the Resources[] array.
            foreach (string res in Resources)
            
                // Add each resource file to the compiled stub.
                CParams.EmbeddedResources.Add(res);
            
        

        // Dictionary variable is used to tell the compiler that we want
        // our file to be compiled for .NET v2
        Dictionary<string, string> ProviderOptions = new Dictionary<string, string>();
        ProviderOptions.Add("CompilerVersion", "v2.0");

        // Now, we compile the code and get the result back in the "Results" variable
        CompilerResults Results = new CSharpCodeProvider(ProviderOptions).CompileAssemblyFromSource(CParams, source);

        // Check if any errors occured while compiling.
        if (Results.Errors.Count > 0)
        
            // Errors occured, notify the user.
            MessageBox.Show(string.Format("The compiler has encountered 0 errors",
                Results.Errors.Count), "Errors while compiling", MessageBoxButtons.OK,
                MessageBoxIcon.Error);

            // Now loop through all errors and show them to the user.
            foreach (CompilerError Err in Results.Errors)
            
                MessageBox.Show(string.Format("0\nLine: 1 - Column: 2\nFile: 3", Err.ErrorText,
                    Err.Line, Err.Column, Err.FileName), "Error",
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            
            return false;

        
        else
        
            // No error was found, return true.
            return true;
        

    

谢谢。

【问题讨论】:

我猜你总是可以将 libclang 包装在一个 DLL 中 见msdn.microsoft.com/en-us/library/ms235639.aspx。但我认为这个任务比你想象的要复杂得多:)(请参阅制作文件...) Clang++ 是 Clang 编译器的编译器前端。如果您想将编译器用作服务,我建议将 libclang 包装在 DLL 中,这是您可以 P/Invoke 的实际编译器。 clang.llvm.org @SaqibVohra:那么它就不是一个普通的 IDE。任何健全的软件都将 IDE 和编译器分开,这是有很多很好的理由的。除此之外,您问我们如何从头开始编写功能齐全的 C++ 编译器,没有任何想法或具体问题? -1 来自我。 你的最后两个共同点相互冲突“But i want to integrate compiler feature in my IDE, i.e it should not use any other program to compile other than my IDE”和“I want to use some existing C++ compiler like gcc”,是哪个? 【参考方案1】:

当您安装 Visual Studio 或安装 Windows SDK 时,虽然它不在 .NET 中,但它会将程序集 CppCodeProvider.dll 安装到包含 CppCodeProvider 类的 GAC 中。

但是我不知道部署起来有多容易,您可能需要在部署时将 CppCodeProvider.dll 包含在您的类中以及您发现它依赖的任何其他 dll 中。

【讨论】:

非常感谢 :) 但我仍然想知道编译后的 C++ 代码的“.exe”是否需要 .net 才能运行? 不,它不需要 .net,它可能需要或不需要安装 C++ 运行时,具体取决于您的编译选项,但它不需要 .net。 非常感谢 :) 这就是我要找的东西 我尝试了很多使用 CppCodeProvider,但无法正确使用,因为在任何地方都没有正确提供文档。你能指导我斯科特吗?我尝试了一些实现,但无法取得成功。 ***.com/questions/23553159/… 我没用过,这个问题我没有指导意见。

以上是关于如何使用 C# 编译 C++ 代码。需要开发 C++ IDE [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c语言和c++和c#的区别

如何在Visual Studio中选择C++和C#的编译器版本

c# - 缺少 Microsoft.VisualC.CppCodeProvider

在 C#(WPF) 中使用 C++ dll

从 Java / C# 的角度理解 C++ 编译器

C# DLL如何保护防止被破解