Visual Basic COM DLL не загружает сборку COM .NET при обновлении версии - PullRequest
0 голосов
/ 22 мая 2018

Раньше у меня была COM DLL-библиотека Visual Basic (VB6) (назовем ее «dllouter»), которая ссылалась на другую COM DLL-библиотеку Visual Basic (VB6) (назовем ее «dllinner») с интерфейсом «Интерфейс».«dllouter» загрузил «dllinner» следующим образом:

Public objCom As dllinner.Interface

Set objCom = New dllinner.Interface

Когда версия «dllinner» изменилась, без изменений в «Interface», «dllouter» смог загрузить его без проблем, без необходимости перекомпиляцииit.

После этого я заменил «dllinner» на сборку C # .NET (VS2015) на [assembly: ComVisible(true)] и перекомпилировал «dllouter», все было нормально и работало.

Но если яизменить [assembly: AssemblyVersion("1.0.0")] на более новую версию, тогда Set objCom = New dllinner.Interface не удастся.Мне нужно перекомпилировать «dllouter» после обновления ссылки на новый «dllinner», чтобы он заработал.

Я заметил, что сравнивая файлы .vbp со ссылками на Visual Basic «dllinner» и .NET «dllinner»"есть разница в версии, указанной после GUID:

Reference = * \ G {6B0651C5-5225-42A6-841F0322797E5018} # 1.0 # 0 # ...

Значение, выделенное полужирным шрифтом, обновляется для сборки .NET с новой версией сборки (например, 2.0), в то время как оно остается неизменным для ссылки DLL Visual Basic (всегда 1.0, независимо от версии dllinner).

Таким образом, я попытался добавить свойство [assembly: TypeLibVersion(1,0)] в assemblyinfo.cs, и это «исправляет» ссылку в .vbp, означая, что значение, выделенное жирным шрифтом, сохраняется равным 1,0, независимо от того, что такое AssemblyVersion.Однако проблема не решена: «dllouter» все еще не может загрузить «dllinner».

Есть ли способ исправить эту проблему, избегая перекомпиляции «dllouter» каждый раз, когда изменяется версия «dllinner»?

1 Ответ

0 голосов
/ 22 мая 2018

Если вы хотите, чтобы видимая сборка COM была совместима с предыдущей версией, вы должны:

1) Убедитесь, что в интерфейсе нет видимых изменений.Если есть изменения в развернутых интерфейсах, то ваш новый объект не совместим, и вам придется генерировать новые CLSID, IID и новую библиотеку типов.

2) Убедитесь, что каждый видимый класс помечен с помощьюIID, который совпадает с предыдущей версией.Если вы забыли сделать это в предыдущей версии, компилятор сгенерирует ее для вас, поэтому вам нужно выяснить, что это было, чтобы новая версия могла быть такой же.Вы можете использовать TlbView или реестр, чтобы выяснить это.

3) убедитесь, что каждый создаваемый класс помечен CLSID, который совпадает с предыдущей версией.

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

Примечание: Если вы хотите добавить дополнительные функции, вы можете сделать это, но вам нужно создать новый IID для нового интерфейса, который должен наследоваться от старого интерфейса (которыйдолжен быть помечен старым IID).

...