Как можно автоматически обновить COM-ссылку проекта .NET?

У меня есть устаревшая VB6 COM DLL, которая включена в качестве ссылки в проект .NET. Мой процесс сборки вручную выглядит так:

  1. Сборка VB6 DLL
  2. Скопируйте VB6 DLL в справочный каталог
  3. Зарегистрируйте VB6 DLL с regsvr32
  4. В проекте .NET удалите старую ссылку
  5. Добавить ссылку на новую VB6 DLL (просмотреть)
  6. Установите для свойства Isolated ссылки значение True.
  7. Построить .NET-решение

Я занимаюсь автоматизацией этой процедуры. Шаги с 4 по 6 вызывают у меня проблемы. Когда я регистрирую новую VB6 COM DLL, старая ссылка в проекте .NET недействительна. Заглянув в файл проекта, я вижу следующее:

<ItemGroup>
  <COMReference Include="DllName">
    <Guid>{65CDCC83-E707-4AA3-8940-FE79F265D570}</Guid>
    <VersionMajor>50</VersionMajor>
    <VersionMinor>0</VersionMinor>
    <Lcid>0</Lcid>
    <WrapperTool>tlbimp</WrapperTool>
    <Isolated>True</Isolated>
    <EmbedInteropTypes>True</EmbedInteropTypes>
  </COMReference>
</ItemGroup>

Я считаю, что мне нужно автоматически перезаписать свойство Guid новым clsid COM, и мне может потребоваться изменить свойства VersionMajor и VersionMinor.

К сожалению, это не похоже на свойства файла VB6 COM DLL. Где я могу получить эту информацию и / или иду ли я по правильному пути? Есть ли какой-нибудь инструмент или опция, которая сделает это за меня автоматически?

Изменить

Ошибка сборки, которую я получаю, если не обновляю ссылку, - это error MSB3179.

Фактический текст сообщения об ошибке:

c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Microsoft.Common.targets (2580,9): ошибка MSB3179: проблема с выделением ссылки COM «DllName»: для этого компонента не обнаружены зарегистрированные классы. [путь / к / projfile.vbproj]

... где «DllName» - это имя моей библиотеки DLL, а «path / to / projfile.vbproj» - это полный путь к файлу проекта со ссылкой на COM.


person Scott Whitlock    schedule 23.05.2012    source источник
comment
Я не думаю, что вы можете решить эту проблему без использования опции двоичной совместимости vb6, чтобы руководство оставалось стабильным.   -  person Hans Passant    schedule 23.05.2012
comment
@HansPassant - Да, сейчас я устанавливаю для DLL двоичную совместимость и вижу, что Guid и версия остаются постоянными. Однако при создании решения я все еще получаю сообщение об ошибке MSB3179.   -  person Scott Whitlock    schedule 23.05.2012
comment
Каков фактический текст сообщения об ошибке?   -  person Hans Passant    schedule 23.05.2012
comment
@HansPassant - я добавил полный текст сообщения об ошибке в конец своего вопроса. Спасибо.   -  person Scott Whitlock    schedule 24.05.2012
comment
Похоже, что regsvr32.exe не справился со своей задачей. Вы запускали его из командной строки с повышенными привилегиями, чтобы у него был доступ к реестру?   -  person Hans Passant    schedule 24.05.2012
comment
@HansPassant - Да, я запускаю командный файл от имени администратора.   -  person Scott Whitlock    schedule 24.05.2012
comment
Что ж, если ничего не помогает, воспользуйтесь утилитой SysInternals ProcMon. Вы можете увидеть, как regsvr32.exe записывает ключи, а msbuild читает их. Выскочит какое-то несоответствие или сбой api, если вы не утонете в данных.   -  person Hans Passant    schedule 24.05.2012


Ответы (1)


Я не пробовал этого, но вы можете добиться этого, явно сгенерировав сборку взаимодействия с помощью tlbimp, вместо того, чтобы позволить Visual Studio сделать это за вас, добавив ссылку на COM DLL.

Что-то типа:

  1. Сборка VB6 DLL
  2. Скопируйте VB6 DLL в справочный каталог
  3. Запустите tlbimp (например, из пакетного файла), чтобы сгенерировать сборку взаимодействия в справочном каталоге.
  4. В проекте .NET должна быть ссылка на выходные данные сборки взаимодействия на шаге 3.
  5. Построить .NET-решение

Используя ваш метод, я больше не использую COM без регистрации

У меня нет большого опыта работы с Reg-free COM, но, возможно, вы можете вручную сгенерировать манифест с помощью инструмента командной строки вместо установки свойства Isolated - например, с помощью инструмента MT.EXE, описанного в этом ответе.

person Joe    schedule 23.05.2012
comment
Я пробовал это. Он работает на машине разработчика, но не после публикации (я использую ClickOnce). Используя ваш метод, я больше не использую COM без регистрации в моем развертывании (это то, что делает свойство Isolated). Свойство Isolated недоступно, если я создаю взаимодействие самостоятельно без регистрации COM-библиотеки. - person Scott Whitlock; 24.05.2012
comment
Я думаю, что это ответ, но я не могу заставить его работать. Частично это связано с непониманием reg-free COM. Я жульничал, позволяя Visual Studio делать всю работу за меня. :) - person Scott Whitlock; 24.05.2012