以编程方式编译/构建C#项目

时间:2018-04-17 06:56:59

标签: c# .net msbuild

我在c#中有一个项目,我想以编程方式编译并将其放在Release文件夹中。

我正在使用CodeDomProvider,下面是我的代码:

 class Compiler
    {
      public static void Build(string filename,string outputAssemblyPath)
        {

            CodeDomProvider cdp = CodeDomProvider.CreateProvider("CSharp");
            CompilerParameters cp = new CompilerParameters()
            {
                GenerateExecutable = true,
                GenerateInMemory = true,
                IncludeDebugInformation = true,
                OutputAssembly = outputAssemblyPath
            };
            CompilerResults result = cdp.CompileAssemblyFromFile(cp, filename);

            foreach (string s in result.Output)
            {
                Console.WriteLine(s);
            }
        }
}

我按以下方式调用Build方法:

 class Program
    {
        static void Main(string[] args)
        {
            Compiler.Build("C:/Projects/Project1/alan.project/Project1.csproj", "C:/Projects/Project1/alan.project/bin/Release/");
            Console.ReadLine();
        }
    }

我想做的只是点击" Rebuild"并将我的项目编译在Release目录中,我希望它以编程方式完成。

1 个答案:

答案 0 :(得分:2)

使用MSBuild SDK的决定之一,允许在C#上创建自定义任务。通过它,您可以控制构建过程,描述自己的逻辑。

using Microsoft.Build.Construction;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System.Linq;

namespace MSBuild.Common
{
    class Build : Task
    {
        [Required]
        public string Solution
        {
            get;
            set;
        }

        public override bool Execute()
        {
            return BuildEngine2.BuildProjectFilesInParallel(SolutionFile.Parse(Solution).ProjectsByGuid.Select(p => p.Value.AbsolutePath).ToArray(), null, null, null, null, true, false);
        }
    }
}

这是任务示例。它接受解决方案的路径并执行并行编译其项目。您可以向BuildProjectFilesInParallel添加将描述构建过程的属性。

创建任务的调用将来自自定义目标:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" InitialTargets="EntryBuild">

    <UsingTask AssemblyFile="Build.dll" TaskName="Build" />

    <Target Name="EntryBuild">
        <Build Solution="$(Solution)" />
    </Target>

</Project>

通过MSBuild CLI

执行
msbuild.exe /t:Build.targets /p:Solutin=%pathToSolution%

MSBuild Targets | Task Writing