When developing for Sharepoint or working on CRM DLLs, you need to recycle the IIS app pool a fair bit.
Maybe I’m late to the party and everyone already knows this, but just in case, this utility for resetting iis app pools rocks: http://www.harbar.net/articles/APM.aspx
You can also recycle an app pool in a script with
cscript c:\windows\system32\iisapp.vbs /a "CRMAppPool" /r
But, for my CRM DLL, I need a post-build event that stops the app pool before I copy a DLL. I tried simply using iisapp.vbs to recycle, but this failed sometimes because the DLL can still be in use after the restart (I'm not sure if it restarts too fast, or if it due to overlapped recycling).
Based on posts from http://mscrm4ever.blogspot.com/2008/12/expediting-plug-in-development-using-vs.html and http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_21362452.html , I ended up with the below.
My post-build event:
cscript /nologo "$(ProjectDir)\iis_stop_app_pool.vbs" "CRMAppPool"
set CRMDIR=C:\Program Files\Microsoft Dynamics CRM
xcopy "$(TargetPath)" "%CRMDIR%\Server\bin\assembly" /i /d /y
xcopy "$(TargetDir)$(TargetName).pdb" "%CRMDIR%\Server\bin\assembly" /i /d /y
cscript /nologo "$(ProjectDir)\iis_start_app_pool.vbs" "CRMAppPool"
The stop and start scripts:
iis_stop_app_pool.vbs:
Option Explicit
Dim apool, strComputer, objWMIService, colItems, objItem
apool = WScript.Arguments.Item(0)
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:{authenticationLevel=pktPrivacy}\\" _
& strComputer & "\root\microsoftiisv2")
Set colItems = objWMIService.ExecQuery _
("Select * From IIsApplicationPool Where Name = " & _
"'W3SVC/AppPools/" & apool & "'")
For Each objItem in colItems
Wscript.Echo "Stopping " & objItem.Name
objItem.Stop
Next
iis_start_app_pool.vbs:
Option Explicit
Dim apool, strComputer, objWMIService, colItems, objItem
apool = WScript.Arguments.Item(0)
strComputer = "."
Set objWMIService = GetObject _
("winmgmts:{authenticationLevel=pktPrivacy}\\" _
& strComputer & "\root\microsoftiisv2")
Set colItems = objWMIService.ExecQuery _
("Select * From IIsApplicationPool Where Name = " & _
"'W3SVC/AppPools/" & apool & "'")
For Each objItem in colItems
Wscript.Echo "Starting " & objItem.Name
objItem.Start
Next