我正在尝试使用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"
答案 0 :(得分:0)
我想知道在您尝试复制时是否有可能卸载未完成?也就是说,调用UninstallAssembly同步还是异步?解决“文件使用中”问题的一种方法是尝试使用SysInternals MoveFile.exe之类的工具重命名文件,然后安装新版本。