Как .NET/COM работает с несколькими версиями, зарегистрированными через Regasm?

StackOverflow https://stackoverflow.com/questions/1718641

  •  19-09-2019
  •  | 
  •  

Вопрос

У меня есть DLL .NET (которая написана на C++/CLI).Части этого я хочу предоставить через COM.Я делаю это и регистрирую его, используя «regasm my.dll/codebase».Все идет нормально.Но потом я кое-что меняю и номер версии сборки меняется плюс я перемещаю dll в другую папку.Я регистрирую его еще раз и просматриваю свой COM-объект в средстве просмотра OLE/COM.Я вижу что-то вроде этого

InprocServer32 [Codebase] = file://c://foo/bar/my.dll
7.0.0.0 [Class] = My.Blah.Class
7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234
7.0.0.0 [RuntimeVersion] = v2.0.50727
7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll
7.0.0.27397 [Class] = My.Blah.Class
7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234
7.0.0.27397 [RuntimeVersion] = v2.0.50727
7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll

Вопросы о нескольких версиях:

  1. Поэтому я думаю, что победит последний зарегистрированный COM-объект.Не имеет значения, зарегистрирован ли у меня старый COM-объект 7.0.0.0, 7.0.0.27397 — это тот, который будет создан, когда я создам экземпляр своего COM-объекта, потому что я зарегистрировал его последним.Это верно?

  2. К сожалению, я не удержал объект 7.0.0.0.Есть ли способ избавиться от этого?Есть ли какой-нибудь способ удалить все версии COM-объекта, кроме как зайти в реестр и удалить его вручную?

  3. Просто из любопытства: если бы я специально хотел создать конкретную версию моего COM-объекта, есть ли способ сделать это?(Я использую C++, если вы хотите привести пример кода).

  4. Могу ли я как-нибудь просто сказать regasm не сохранять номер версии, потому что это просто загромождает ситуацию, и я не вижу, в чем выгода.Если бы мой COM-объект претерпел значительные изменения API, я бы просто изменил GUID и progid, верно?Что делать, если я не хочу регистрировать несколько версий (я этого не делаю).

Это было полезно?

Решение

Именно по этой причине я всегда настраиваю видимые сборки COM со статической версией AssemblyVersion.Если вы хотите, чтобы двоичные файлы были помечены версией, используйте вместо этого AssemblyFileVersion.

  1. Побеждает последний зарегистрированный объект:ага
  2. Не совсем.Вы можете поместить что-то в атрибутированные методы ComRegisterFunction/ComUnregisterFunction вашей сборки, чтобы автоматизировать очистку, но если вы оставляете остатки старой версии, это почти единственный способ.
  3. Вы бы сделали это с другим GUID кокласса и/или ProgID (например, MyCoClass.1, .2 и т. д.).CoCreateInstance ничего не знает о значениях версий — они используются активатором CLR, чтобы гарантировать загрузку правильной сборки.
  4. Нет, лучше никогда не менять версию сборки (см. выше).

Другие советы

Компоненты с одинаковым CLSID должны быть совместимыми, особенно если вы меняли только номер сборки между сборками.Вот единственный соответствующий вещь, которую я нашел, чтобы подтвердить это, быстро погуглив.

Чтобы ответить на ваши вопросы напрямую:

  1. Правильный.
  2. регазмировать/отменить регистрацию
  3. Посмотрите Привязка перенаправлений.
  4. Возможно нет.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top