System.EnterpriseServices和Powershell锁定DLL

时间:2010-09-03 15:49:40

标签: com powershell installation

我正在尝试使用System.EnterpriseServices卸载c#com +组件,替换dll并重新安装新版本。

问题是,当我到达行拷贝项时,脚本总是失败,因为System.EnterpriseSerivces正在锁定目标文件。如果我将脚本分成两部分,一部分调用UnistallAssembly,第二部分执行复制并调用InstallAssembly,一切正常。

强制system.enterpriseservices发布dll的任何想法?

$comRoot = "C:\Comroot\"
[void][System.Reflection.Assembly]::LoadWithPartialName("System.EnterpriseServices")
[System.String]$applicationName = "My App Name";
[System.String]$typeLibraryName = $null;

$objAdmin = new-object -com COMAdmin.COMAdminCatalog
$objAdmin.ShutdownApplication("$applicationName");
$objAdmin = $null

$helper = New-Object System.EnterpriseServices.RegistrationHelper 
$helper.UninstallAssembly("$comRoot\$StepName.dll", $applicationName)
$helper = $null
$applicationName = $null
[gc]::collect() 
[gc]::WaitForPendingFinalizers()

"SOURCE : $BranchPath\Steps\$StepName\bin\Debug\"
"DESTINATION : $comRoot"
copy-item "$BranchPath\Steps\$StepName\bin\Debug\*$StepName*" -destination "$comRoot" -    force

$helper = New-Object System.EnterpriseServices.RegistrationHelper 
$helper.InstallAssembly("$comRoot\$StepName.dll", [ref] $applicationName, [ref]       $typeLibraryName, [System.EnterpriseServices.InstallationFlags]::ConfigureComponentsOnly);
"Install Complete <$typeLibraryName>"
Read-Host "Press any key to exit"

1 个答案:

答案 0 :(得分:0)

我想知道在您尝试复制时是否有可能卸载未完成?也就是说,调用UninstallAssembly同步还是异步?解决“文件使用中”问题的一种方法是尝试使用SysInternals MoveFile.exe之类的工具重命名文件,然后安装新版本。