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

У меня есть .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, версия = 7.0.0.0, Culture = нейтральный, PublicKeyToken = 1dd19234234
7.0.0.0 [RuntimeVersion] = v2.0.50727
7.0.0.0 [CodeBase] = файл: //c: /dooby/do/my.dll
7.0.0.27397 [Class] = My.Blah.Class
7.0.0.27397 [Assembly] = Sync, версия = 7.0.0.27397, Culture = нейтральный, 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, верно? Что делать, если я не хочу регистрировать несколько версий (я не хочу).

7 голосов | спросил mhenry1384 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 01:48:59 +0300 2009, 01:48:59

2 ответа


0

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

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

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

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

  1. Правильно.
  2. regasm /unregister
  3. Посмотрите Связанные перенаправления .
  4. Вероятно, нет.
ответил Mike Atlas 12 42009vEurope/Moscow11bEurope/MoscowThu, 12 Nov 2009 02:01:42 +0300 2009, 02:01:42

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132