oynix

人生需要一些摸鱼时刻,做什么都可以,不做什么也可以

在代码中通过MSBuild编译CSharp项目

MSBuild命令是微软提供的编译CSharp项目的一种方式。如果有这样的需求,将一个单Project的Solution编程生成DLL文件,然后将DLL文件作为依赖添加到Unity工程中,相比于每次都打开CSharp工程编译,通过代码进行这个操作较为方便。

1. MSBuild命令位置

在安装Unity Editor时,如果同时选择安装了Visual Studio,那么MSBuild也会一同安装,如果没有勾选,则需要手动安装。对于MacOS系统,位置如下,

1
/Library/Frameworks/Mono.framework/Versions/Current/Commands/msbuild

而对于Windows,在Visual Studio 2022中,它安装在Visual Studio安装文件夹下,对于Windows 10上的经典安装,MSBuild.exe位于MSBuild下的CurrentBin中的安装文件夹下,

1
C:\Program Files (x86)\Microsoft Visual\2019\Community\MSBuild\Current\Bin\MSBuild.exe

2. 编译

使用较为简单,可以使用MSBuild编译整个Solution,也可以只编译其中一个Project,我的Solution里只有一个Project,所以直接编译的是Solution。

1
msbuild solutionRootPath -p:Configuration=Release

如果是编译Project,替换一下path即可,

1
msbuild projectRootPath -p:Configuration=Release

每个配置里都指定了一些属性的值,比如DLL的输出位置,如下,Debug的在bin下的Debug目录下,而Release的在bin的Release下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>

3. csproj文件

在Project根目录下,有个csproj结尾里面是xml格式的文件,这个是Project的配置文件,使用IDE创建项目时会自动生成,相关的属性都会在这个文件中。默认会生成2个配置,Debug和Release,缺省值是Debug。

上面的命令中,表示指定使用Release配置编译Project。

4. 关于csproj文件中引用的cs文件

csproj中有一个ItemGroup标签,里面显示指定里被包含在项目的中参与编译的cs文件。也就是说,即便是在Project下新建了cs文件,但是不包含在ItemGroup标签中,那么编译时是找不到的。

因为依赖引用路径多系统有所区别,所以这个csproj文件并没有被git追踪。因此,多人合作时,就会遇到一个问题,别人新建的cs文件,自己还需要手动添加进去,为了减少这些重复的操作,较为合理的方式是通过代码做这件事,省时且快速。

一键更新ItemGroup标签内容,将新增的cs文件添加至其中,将已经删除的cs文件从里面删除。思路相对清晰,解析csproj文件,找到其中的引用ItemGroup标签,清空其下的所有cs文件,然后遍历Project中的所有文件,将cs文件依次添加至ItemGroup标签下。

结果大致如下,只罗列了几个文件。这里要注意第一个文件AssembleInfo.cs,这个是DLL的元数据,也需要添加至其中。

1
2
3
4
5
6
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Scripts\AAA.cs" />
<Compile Include="Scripts\BBB.cs" />
<Compile Include="Scripts\CCC.cs" />
</ItemGroup>
------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.net/2024/02/c47887e5b021/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道