描述
我们在编译c#项目时,往往需要通过Visual studio来编译,具体操作为:右击项目,生成,这个时候,vs会帮我们把项目进行编译到指定的文件夹(如bin/debug),有的时候我们需要批量生成很多项目并按照一定的顺序,而且可能没有vs环境,这时候我们就需要借助msbuild(vs编译项目就是通过它来完成的)来直接生成.
先来看个简单例子:
1.创建一个空白项目
2.在vs中打开powerShell,并cd到包含项目.csproj的文件夹下
3.执行msbuild ConsoleApp1.csproj -p:Configuration=DEBUG
msbuild ConsoleApp1.csproj -p:Configuration=DEBUG
解释一下这句代码,ConsoleApp1是你的项目名称,-p:Configuration=DEBUG是说你这次编译的配置,按照项目的debug配置来(包含了将项目生成到debug文件夹下的一堆东西),msbuild可以跟很多参数,具体某个参数代表什么,请参考官方文档
msbuild在执行时,内部是通过读取Console1.csproj,获取到项目的相关信息,包含依赖,项目资源,cs文件路径等等;并按照相关编译配置(一般是debug或release)调用csc.exe,将项目打包成中间文件(IL),一般是exe或dll
在debug文件夹下已经能看到我们生成的ConsoleApp1.exe
到这里,我们其实还在用vs来生成项目,我们如果把 msbuild ConsoleApp1.csproj -p:Configuration=DEBUG拷贝到cmd中,依然会报错,不认识msbuild
这是因为msbuild是vs自带的一个编译器,想要被系统识别,我们需要将msbuild.exe的文件路径添加到系统变量中
msbuild加入到系统变量
1.打开控制面板并选择"系统和安全"。
2.点击"系统",然后选择"高级系统设置"。
3.在弹出的窗口中,点击"环境变量"按钮。
4.在"系统变量"部分,找到名为"Path"的变量,并双击它。
5.在弹出的编辑环境变量窗口中,点击"新建"按钮。
6.输入MSBuild的安装路径(例如:D:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin),也就是vs安装路径。
7.确认所有窗口并重新启动计算机。
再来执行代码 发现就能正常编译了
当然,你可能需要将项目路径设置为绝对路径,因为你并没有cd到项目路径下
到这里并没有完,我们希望通过脚本或者c#代码中使用它,而不是自己打开cmd敲命令.
生成bat脚本
1.新建text.bat
2.在test.bat脚本中添加如下代码
start msbuild D:\learn\wpf\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj -p:Configuration=DEBUG
3.双击test.bat 项目编译成功
如果有多个项目,运行多条start即可
在c#中执行代码完成编译
1.直接调用执行bat文件
// 设置要执行的命令和参数
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/test.bat";//绝对路径
// 隐藏命令行窗口
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// 启动进程
process.Start();
process.WaitForExit();
// 检查进程的退出代码
if (process.ExitCode == 0)
{
Console.WriteLine("批处理文件执行成功!");
}
else
{
Console.WriteLine("批处理文件执行失败!");
}
2.在代码中运行
// 设置要执行的命令和参数
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = " msbuild D:\learn\wpf\ConsoleApp1\ConsoleApp1\ConsoleApp1.csproj -p:Configuration=DEBUG";
// 隐藏命令行窗口
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// 启动进程
process.Start();
process.WaitForExit();
// 检查进程的退出代码
if (process.ExitCode == 0)
{
Console.WriteLine("批处理文件执行成功!");
}
else
{
Console.WriteLine("批处理文件执行失败!");
}