У меня есть настройка процесса сборки для построения управляемого решения с использованием команды build.Это решение требует, чтобы неуправляемый компонент был зарегистрирован на сервере до того, как мы создадим решение, поскольку мы взаимодействуем с ним через COM.
Активность (InvokeProcess), которую я использую для регистрации ComObject, выглядит примерно так
regsvr32.exe /s ComObject.ocx
Активность (InvokeProcess), которую я использую для отмены регистрации, выглядит примерно так
regsvr32.exe /u /s ComObject.ocx
Я также добавил WriteBuildMessage
и WriteBuildError
к обеим InvokeProcess
операциям, используя stdOutput и errOutput каксообщение для каждого действия.Я также убедился, что значение сообщения сборки было высоким.
Насколько я понимаю, это должно перенаправить стандартный вывод и вывод ошибок в эти действия по ведению журналов.
Регистрация, сборка и разрегистрация работают нормально, пока я не установил /maxcpucount
аргумент MSBuild для чего-то большего, чем 1.
Как только я установил для него значение, большее чем 1, наш скрипт очистки в конце процесса завершится неудачно с этим сообщением об ошибке при попытке удалить рассматриваемый файл.
Access to the path '...\ComObject.ocx' is denied.'
Я думаю, что происходит то, что при отмене регистрации не удается отменить регистрацию ComObject.ocx с сервера, потому что MSBuild с ним не работает, когда он работает на нескольких процессорах.Затем, когда я спускаюсь, чтобы попытаться удалить его с сервера сборки, он все еще зарегистрирован в системе и завершится с ошибкой отказа в доступе.
Так как мне получить выходные данные regsvr32 в stdOutput и errOutput, чтобыдействия WriteBuildMessage и writeBuildError будут правильно отображаться в журналах сборки.Если я вызываю regsvr32 с несуществующим файлом, я ничего не вижу в журнале сборки.
Надеюсь, это имеет смысл.
Обновление
Решение этой проблемы пришло из небольшого изменения решения Пантелифа.То, что я сделал, было в блоке if, который выдает исключение, я делаю WriteBuildError, используя это как сообщение:
String.Format("ErrorMessage: {0}", New System.ComponentModel.Win32Exception( System.Runtime.InteropServices.Marshal.GetLastWin32Error() ).ToString() )
Это позволяет мне получить ошибку от regsvr32.exe и записать ее в журнал сборки.