Захват вывода regsvr32 в действии рабочего процесса InvokeProcess TF - PullRequest
4 голосов
/ 19 июля 2011

У меня есть настройка процесса сборки для построения управляемого решения с использованием команды 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.GetL‌​astWin32Error() ).ToString() )

Это позволяет мне получить ошибку от regsvr32.exe и записать ее в журнал сборки.

1 Ответ

5 голосов
/ 21 июля 2011

Что касается вашего первого вопроса:
Я полагаю, что можно получить выходные данные, применив метод, представленный Э. Хофманом здесь .

Более конкретно, если вы создаетевнутри вашего «InvokeProcess» последовательность, подобная представленной (рис. также из поста Эвальда):
enter image description here
, а затем назначьте «WriteBuildMessage» для отметки «ErrorMessage», вы, вероятно, в итоге получите желаемый результатв сгенерированном журнале сборки.

...