C#,C++等开发项目,需要通过解决方案 .sln,解决方案中的项目 .csproj 来管理项目中代码

C#,C++等开发项目,需要通过解决方案 .sln,解决方案中的项目 .csproj 来管理项目中代码

项目中每个 .csproj 会生成一个dll文件,也就叫程序集。dll可以是启动程序,也可以是能被其它dll调用的类库。

解决方案 .sln 文件,定义了此解决方案包含哪些子项目,哪个是启动项目,而.csproj文件定义子项目包含哪些类,还有对其它dll的引用关系

用文本编辑器打开一个 .sln文件,可以看出来,解决方案文件,包含哪些项目和加载顺序:

  • 开发者可以手动直接编辑这个 .sln文件
  • 也可以在vs 操作菜单创建子项目,或者编辑指定启动项目,这些操作结果会自动修改并保存到.sln文件中
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2010
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.App", "App\Server.App.csproj", "{11464C2C-E0B6-476E-ABB1-87445E736B76}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.Hotfix", "Hotfix\Server.Hotfix.csproj", "{E383A68D-1928-46F4-8896-4E99DF331476}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.ET.Core", "ET.Core\Server.ET.Core.csproj", "{85CB09B5-6392-4A13-BAF8-025218BFF496}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ThirdParty", "ThirdParty", "{5D11E730-0CAA-4A47-BA1A-379004F0F6D9}"
EndProject

 

 

Unity能用 vs 来开发脚本代码,是因为Unity自动帮我们生成了这些.sln,.csproj文件

  • 每次打开整个项目,首先要成功的加载解决方案中的各个子项目到开发环境中:
    这句话怎么理解呢,只有vs 开发环境成功加载了这个方案的所有子项目,我们打开各个类,才能看到属性与方法的引用关系,点击变量或调用方法名才可以跳转到原始定义的地方,才能编译才能调试。
  • 如果某个项目中有代码错误,导致打开解决方案时,不能成功加载这个子项目到开发环境中,那这个项目中的所有类就会显示找不到了,当然方法和属性也不会有自动提示。
  • Unity项目开发时,会经常碰见Text,Image类不能用,找不到的情况,那是因为项目中的代码用到了UI程序集,但是没有正确的生成项目的.csproj文件,里面没有引用 "UnityEngine.UI"程序集,那在这个项目的开发环境中自然找不到UI程序集中的Text,Image等类了。

 

Unity自动生成Assembly-CSharp项目

如果我们没有自己创建与设定.csproj子项目来管理脚本,那只要Assets目录下有脚本文件,Unity都会自动生成一个Assembly-CSharp项目来管理这些代码。

vs code打个这个Assembly-CSharp.csproj文件,可以看到对这些脚本文件的引用:

<Compile Include="Assets\Joystick Pack\Examples\JoystickPlayerExample.cs" />
    <Compile Include="Assets\Joystick Pack\Examples\JoystickSetterExample.cs" />
    <Compile Include="Assets\Joystick Pack\Scripts\Base\Joystick.cs" />
    <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\DynamicJoystick.cs" />
    <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\FixedJoystick.cs" />
    <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\FloatingJoystick.cs" />
    <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\VariableJoystick.cs" />
    <None Include="Assets\Res\Config\Moba5V5Config.txt" />
    <None Include="Assets\Res\Config\HeroConfig.txt" />
    <None Include="Assets\Res\Config\SkillConfig.txt" />
    <None Include="Assets\Res\Config\GlobalProto.txt" />

 

如果你既创建了项目来管理代码,又还有一些是直接在Aseets中,没有归入到指定项目中的(这里我把他们叫“散落脚本”,这些代码就是在Assembly-CSharp项目中)。

那么可以得出结论,Unity正确的管理项目代码的方式是,自己创建项目进行管理,最好不要有散落脚本。

 

有了前面的理解,终于可以进入正题了

我们可以在任一Assets目录下的某个目录下创建.asmdef文件,那么Unity就会帮我们创建一个以这个.asmdef文件名为名称的项目,并把.asmdef所在目录,及以下所有子目录中的脚本全部纳入到创建的这个项目中。

箭头所指就是我们在对应目录下创建的.asmdef文件,自然就形成了我们需要的项目文件:

在Unity Project面板中选择.asmdef文件

可以给这个项目添加对其它项目的引用,比如上图Unity.Model项目引用了ET.Core,Unity.ThirdParty项目。

通过这节课,大家应该理解和掌握什么是项目,什么是程序集了吧?以及通过解决方案管理所有包含的子项目。

如果大家再遇到上面所说的那些意外情况,有寻找问题和解决问题的思路了吧。

另外,还有可能插件,package manager中的包导致Unity不能正确生成.csproj文件的情况,大家可以参考:https://www.taikr.com/article/3928 

当然.asmdef管理项目代码还有别的益处:如果仅更改了某个.dll中的脚本,其它程序集都不需要重新编译。因此它的编译速度比所以脚本都放在Assembly-CSharp.dll编译更快。

posted @ 2022-04-10 11:07  Domefy  阅读(752)  评论(0)    收藏  举报