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

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

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, верно? Что делать, если я не хочу регистрировать несколько версий (я не хочу).

Ответы [ 2 ]

6 голосов
/ 12 ноября 2009

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

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

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

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

  1. Correct.
  2. регазм / незарегистрированный
  3. Просмотр Переадресация привязок .
  4. Вероятно, нет.
...