實驗環境 VS2017 C# .NET4.6 項目都是.net framework框架
目的: 用程序生成解決方案和項目.
思路:手動建一個方案和項目,分析其中的文件內容,做成模板后,由程序調用.最終生成和手動建立的解決方案一樣的內容.
主要文件:
.sln : 解決方案文件,在解決方案目錄下,記錄所含的項目.每個項目是一個Project ... EndProject節點
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MyTestEntity", "MyTestEntity\MyTestEntity.csproj", "{6DD60299-FBA4-4284-BFD2-4CB2626A93F5}"
EndProject
// 第一個GUID表示項目類型(這個是C#項目的).不同項目類型都有個GUID號.這是指定的.網上可查到各種項目的GUID
// MyTestEntity : 項目名字 , MyTestEntity\MyTestEntity.csproj : 項目.csproj文件路徑(相對於解決方案文件夾的) , 后一個GUID是這項目專用的
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{6DD60299-FBA4-4284-BFD2-4CB2626A93F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
EndGlobalSection
// 這個節點不清,大概記錄了項目編譯時的平台,目前是生搬硬套的,結果生成的項目可以正常編譯.
.csproj : 項目文件,在項目目錄下,記錄所含的每一個文件,是一個XML文檔.C#項目的擴展名叫csproj,意為C#項目.
<PropertyGroup>
<ProjectGuid>// 項目GUID標識
<AppDesignerFolder>// 程序集信息文件夾,就是項目中的這個Properties文件夾.里面有個AssemblyInfo.cs記錄了程序集的相關信息
<RootNamespace>// 命名空間
<AssemblyName>// 程序集名
<TargetFrameworkVersion>// 使用.NET框架版本
<ItemGroup>
<Reference Include="System" />// 項目添加的程序集引用
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />// 項目文件,生成操作為"Compile"(編譯) 其后為文件路徑(相對於項目目錄的)
<Content Include="Web.config" />// 項目文件,生成操作為"Content"(內容).
// 查看其它生成操作的辦法是,選中文件按F4,點擊"生成操作"右側的列表,有編譯,內容,嵌入...
<ItemGroup>
<Folder Include="App_Data\" />// 項目文件夾,路徑也是相對於項目目錄的
<ItemGroup>
<ProjectReference // 項目添加的項目引用
其它文件 : 對不同的項目,包含文件不一樣,除了AssemblyInfo.cs這個都有外.空類庫項目不含文件.web項目包含 web.config webapiconfig.cs等文件.這些文件內容可以一樣,模板易做.
制作模板:
除.sln,.csproj外,其它文件的模板可以用導出項目模板的方式取得.
具體辦法是,手動建一個項目,然后使用VS的導出模板功能(選中項目,點擊菜單:項目->導出模板),完成后會得到一個壓縮文件,解壓之.會看到里面的項目文件,打開后發現需要變化的地方比如類的命名空間之類的,已經用"$XXX$"這種形式占位了.所以只需要考慮替換的內容,而不用考慮哪些地方需要替換.直接將這些文件拿出來就有了模板.
.sln,.csproj文件模板比較難做,里面的項目節點和文件節點需要動態生成.目前借助的是MS提供的T4模板,這個東西很好用.使用它的"運行時模板"可以實現.T4模板可以生成文本文件,生成代碼非常容易.如果用過razor,很容易明白它的使用方式,模板里可以運行C#程序,生成各種內容.
t4運行時模板添加后,會自動生成一個以該文件名為類名的類,是一個部分類.調用其中的TransformText()方法得到最終生成的文本.如果需要傳參數,可以建一個同名的分部類,添個構造方法.如果需要修改命名空間,不能直接在類上修改,因為修改后,一保存模板,它就恢復原樣了,需要選中模板,按F4,在屬性"自定義工具命名空間"修改.
生成過程:
項目和解決方案各文件的模板都准備就緒后,開始生成各文件,最終生成解決方案.(生成的文件內容是緩存的,不生成在磁盤上)
先生成項目的各種文件,包含項目特定文件的和自定義的文件(按特定項目目錄結構擺放),注意項目間可能有項目引用要添加的,比如工具類項目會被其它類添加引用.
最后生成.csproj文件.如果有多個項目,重復這個過程
再生成.sln解決方案文件.這個相對簡單些.
得到完全的解決方案文件數據之后,將這些文件保存到磁盤上,先后順序由外層的解決方案目錄開始,到最各項目文件.
<解決方案目錄>
.sln
<項目1目錄>
.csproj
web.config
<Controllers>
<App_Start>
.....
<項目2目錄>....
程序架子大概如此,目前生成一個DAL BLL WEBAPI ENTITY LIB五項目的解決方案,編譯通過.但還需要豐富項目中的各種功能的文件模板.