Ссылка COM + из .Net с различным GUID - PullRequest
3 голосов
/ 21 июля 2010

У нас есть проект, который ссылается на компоненты COM + (написанный на VB6). Компоненты добавляются в наше решение .Net путем «Добавить ссылку». Это работает хорошо, и даже intellisense работает.

Время от времени интерфейсы (совместимость) компонентов нарушаются, и наш код .Net больше не работает. Компонент был добавлен с определенным GUID, этот GUID больше не зарегистрирован.

Вопрос: Можно ли вызывать компоненты COM + так же, как мы привыкли (отражение не допускается), без необходимости обновлять ссылки в нашем решении .Net. Например, путем создания оболочки для компонента COM + на основе имени файла?

С уважением, M.

Ответы [ 3 ]

3 голосов
/ 21 июля 2010

Нет, .NET (как и любая нативная программа) не сможет создать экземпляр COM-компонента без знания правильного GUID.

Лучше всего не допустить, чтобы этот компонент изменил GUID, в первую очередь включите двоичную совместимость в проекте компонента и поддерживайте совместимость интерфейсов. После того, как вы нарушите совместимость интерфейсов, вам нужно будет добавить компонент в вашу программу, чтобы создать новую действительную ссылку. Это не потому, что .NET тупой, а потому, что как только вы нарушили совместимость интерфейсов, вам нужно перекомпилировать клиент.

2 голосов
/ 21 июля 2010

Когда вы добавляете ссылку на COM-объект, Visual Studio автоматически создает Interop для вас. Это взаимодействие по сути является классом-оберткой, ответственным за загрузку COM-объекта, и содержит операторы p-invoke для выполнения вызовов функции.

Если ваш COM-объект изменяется - вы можете либо добавлять ссылку каждый раз при обновлении COM-объекта, либо создавать Interop самостоятельно.

Вы можете сделать это с помощью инструмента tlbimp:

TlbImp.exe "MyCOMClass.dll" /out:Interop.MyCOMClass.dll

Теперь, если вы просто добавляете ссылку на Interop.MyCOMClass.dll вместо объекта COM, то, если объект COM изменяется, вы можете просто сгенерировать Interop с помощью приведенного выше оператора и распространить его вместе с новой версией COM-объект.

0 голосов
/ 07 февраля 2013

Это решение: http://support.microsoft.com/kb/161137

  1. Скопируйте и вставьте скомпилированную VB6 DLL.
  2. Измените расширение на DllName.cmp для образца
  3. Установите для двоичной совместимости между вашей DLL и файлом .cmp.

GUID DLL VB6 не изменится при повторной компиляции;)

Проект> Свойства> Компиляция

...