上面幾篇文章介紹了Microsoft Dynamics CRM 2011中如何進行插件開發,本文將介紹插件的調試。
調試的基本步驟是
1. 注冊、部署插件,這部分內容在上一篇Blog中已經介紹,不再贅述;
2. 將插件的pdb文件拷貝到CRM安裝目錄下的“Server\Bin\Assembly”文件夾下,一般而言,如果使用默認配置安裝的CRM系統,那么此文件夾的全路徑是“C:\Program Files\Microsoft Dynamics CRM Server\Server\bin\assembly”;
3. 配置調試器,即通過Visual Studio .net的附加到相應進程進行調試:
對於運行於服務器上的插件,需要附加的進程是w3wp.exe進程; 如果是調試脫機客戶端中的插件,附加的進程是Microsoft.Crm.Application.Hoster.exe; 如果是異步方式運行的插件,那么附加的進程是CrmAsyncService.exe 如果是運行在沙盒Sandbox中的插件,那么附加的進程是Microsoft.Crm.Sandbox.WorkerProcess.exe 4. 在插件類中,設置斷點;
5. 開始調試,進行界面操作,以觸發插件的運行,以便可以在IDE中開始插件的調試工作。
以下是各個步驟的截屏
1. 插件注冊,請參看文章《MS CRM 2011的自定義和開發(11)——插件(plugin)開發(三)》;
2. 拷貝pdb文件。首先打開插件項目的文件夾,導航到bin\debug目錄下,找到插件程序集相關的pdb文件。如下圖的紅色方框區域所示
將該文件拷貝到CRM$\Server\Bin\Assembly目錄下。
3. 配置調試器,本例中,使用Visual Studio .Net 2010進行調試。點擊“調試”—> “附加到進程”,系統彈出“附加到進程”對話框,在其中列出了當前服務器上運行的進程,根據待調試插件的運行模式、部署模式,選擇目標進程,而后點擊“附加”按鈕即可。如果在進程列表中沒有目標進程,那么,點擊“顯示所有會話中的進程”復選框。
在附加w3wp.exe進程時,如果服務器的IIS中有多個站點同時處於活動狀態,進程列表中就會出現多個w3wp.exe進程,這些進程之間的區別只是第二列ID列的信息不同,那么哪個進程是我們需要附加的進程呢?對於這種情況,可以通過IIS管理器來獲得需要附加的進程。運行IIS管理器,在左側導航欄中,點擊第二個節點,而后再在右側的內容區域點擊“工作進程”,如下圖所示。
內容區域會切換到工作進程列表界面,其中顯示了當前IIS中所有處於運行狀態的W3wp進程,其中第一列是w3wp.exe進程所對應的應用程序池名稱,第二列信息就是進程ID。效果如下圖所示,其中,藍色區域圈定的就是進程ID信息,這將會有助於我們在“附加到進程”對話框中選擇正確的進程予以附加:
4. 設置斷點,這沒有啥可以說的了,對於經常使用Visual Studio.Net的各位同學們已經是駕輕就熟;
5. 運行應用程序,或者使用界面操作的方式,或者使用C#開發的測試程序,總而言之,就是調用組織服務,發起某個請求,以觸發插件的運行。本例中的插件是注冊於account的pre-create事件上。所以呢,就是在crm中新建客戶記錄的時候會觸發插件的運行。ok,通過瀏覽器操作,新建一條客戶記錄。記錄內容如下圖所示。
點擊保存按鈕,會向MS CRM的組織服務發送創建請求,從而觸發插件的運行,此時,由於VS附件到進程已經開啟,將可以對插件進行調試了。效果如下圖所示:
如果Visual Studio沒有被觸發,或者插件類的斷點沒有起作用。首先,要看一下當前MS CRM是否允許進行debug,若否,可打開debug開關。打開Debug開關的步驟如下:
打開CRM$\CrmWeb目錄,其中CRM$指的是微軟CRM的安裝目錄,本例中是“C:\Program files\Microsoft Dynamcis CRM Server”;
找到web.config文件,使用任意編輯器打開該文件;
在web.config文件中找到,<compiliation defaultLanguage=”C#” debug=”…>這一句。默認情況下,debug開關的值是false,為了能夠調試,需要將其設置為true,設置完成后,重新啟動IIS;
設置debug開關項的示意圖如下所示。
此外,除了使用調試器進行debug之外,還可以借助日志與跟蹤服務,來確定插件的執行順序,這樣可以方便我們在不啟用VS等調試工具的前提下,確定問題的根源所在。跟蹤服務ITracingService,也是插件執行上下文中的一個組成部分,可以通過IServiceProvider.GetService()方法獲得,樣例代碼例如:
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
ITracingService實例化時候,可以利用trace方法,創建跟蹤日志信息,例如
tracingService.Trace(“Plug-in execution begin”);