呼叫CodeSmith類庫實現程式碼生成(含原始碼)
CodeSmith的作用是不言而喻的,用過的人都會覺得它非常強大.根據自定義模板,快速生成程式碼.只是我們使用的時候,要在它提供的CodeSmith Studio環境下使用模板,再傳入相應引數,最終生成NET的類檔案.
如果我們可以通過編碼方式,把CodeSmith功能融入NET程式碼中,這樣就會比較靈活,方便我們控制了.根據下面的操作步驟我們就可以實現.
先說下環境,我安裝的CodeSmith版本是5.1,當然是破解版(你懂的).居說CodeSmith註冊費用還是比較昂貴滴.我們需要如下幾個DLL檔案,這幾個檔案在安裝路徑下都可以找到.
CodeSmith.Engine.dll
CodeSmith.Feedback.Client
SchemaExploer.dll
SchemaExploer.SqlSchemaProvider.dll
把這幾個DLL檔案引入專案檔案之後,接下來就需要製作模板了,我們也可以直接使用CodeSmith自帶的模板.開啟CodeSmith Studio,右側就是Template Exploer部分,選擇一個模板,右鍵,選擇Open Folder In Window Exploer選單項,確定好模板路徑後,就可以開始編碼了.
在寫程式碼之前,我們還是先看下模板的組成,如圖-1所示
圖-1
程式碼第2句,Property關鍵字,就表示這個模板的屬性,也是需要我們傳入的引數,看型別是SchemaExploer.DataBaseSchema,也就是說,我們只要傳入這個型別的引數值即可
程式碼如圖-2所示
圖-2
程式碼非常簡單,先要載入模板再編譯,然後傳入屬性值,再輸出就OK了.模板編譯部分是CompileTemplate方法,如圖-3所示
圖-3
傳入屬性值的程式碼是CodeTemplate.SetProperty;
輸出類檔案的程式碼是RenderToFile;
OK,整個過程結束,看看我們的成果吧,如圖-4所示
圖-4
這個模板的作用是生成Db資料庫中所有Db表的列舉類.
編碼方式使用CodeSmith還是非常靈活的,比如我想生成資料庫中Db表的CreateSQL語句,以前我們可能是自己拼寫字串實現,現在使用CodeSmith模板,就非常簡單了.如圖-5所示,大家參考這個程式碼自己試下,是不是非常簡單呢?
圖-5
//引入的名稱空間
//using SchemaExplorer;
//using System.CodeDom;
//using System.CodeDom.Compiler;
/// <summary>
/// 編譯CodeSmith模板
/// </summary>
/// <param name="templateName"></param>
/// <returns></returns>
public CodeSmith.Engine.CodeTemplate CompileTemplate(string templateName,ref string errors)
{
CodeSmith.Engine.CodeTemplate codeTemplate = null;
//編譯器
CodeSmith.Engine.CodeTemplateCompiler compiler = new CodeSmith.Engine.CodeTemplateCompiler(templateName);
compiler.Compile();
//判斷是否編譯成功
if (compiler.Errors.Count == 0)
{
codeTemplate = compiler.CreateInstance();
}
else
{
StringBuilder sbErrors = new StringBuilder();
for (int i = 0; i < compiler.Errors.Count; i++)
{
sbErrors.Append(compiler.Errors[i].ToString());
}
errors = sbErrors.ToString();
}
return codeTemplate;
}
private void btnCodeSmith_Click(object sender, EventArgs e)
{
string errors = string.Empty;
string templateName = string.Empty;
CodeSmith.Engine.CodeTemplate codeTemplate = null;
IDbSchemaProvider provider = new SqlSchemaProvider();
DatabaseSchema dbSchema = new DatabaseSchema(provider, DevelopToolManager.DbConnectionString);
//TableEnum模板
templateName = @"C:\Program Files\Navi.Kernel\CodeSmith Template\TableEnum.cst";
codeTemplate = this.CompileTemplate(templateName, ref errors);
if (string.IsNullOrEmpty(errors))
{
codeTemplate.SetProperty("SourceDatabase", dbSchema);
string csFileName = @"I:\待整理檔案\tableEnum.cs";
codeTemplate.RenderToFile(csFileName, true);
}
//TableSchema模板
templateName = @"C:\Program Files\Navi.Kernel\CodeSmith Template\TableSchema.cst";
codeTemplate = this.CompileTemplate(templateName, ref errors);
if (string.IsNullOrEmpty(errors))
{
TableSchema tableSchema = dbSchema.Tables["AD_AUTHOR"];
codeTemplate.SetProperty("SourceTable", tableSchema);
codeTemplate.SetProperty("ScriptCreate", "true");
//生成字串
string codeTotal = codeTemplate.RenderToString();
MessageBox.Show(codeTotal);
//生成檔案
string csFileName = @"I:\待整理檔案\TableSchema_AD_AUTHOR.cs";
codeTemplate.RenderToFile(csFileName, true);
}
}