Игнорирование номера сборки при обращении к dll - PullRequest
2 голосов
/ 04 июня 2010

У меня есть одно решение с проектом .NET 4.0 (C #), которое создает отложенную подписанную dll, которую я ставлю точечно и подписываю.

РЕДАКТИРОВАТЬ : Вот как я делаю версию DLL:

[assembly: AssemblyVersion("0.7.0.*")]
[assembly: AssemblyFileVersion("0.7.0.0")]

У меня есть другое решение с проектом .NET 4.0 (C ++ / CLI), которое ссылается на подписанную dll и создает подписанную dll (на самом деле, отложенную подписанную и подписанную в пост-сборке из-за недостатка в сборке C ++ система ).

Проблема в том, что ссылка на dll содержит определенный номер версии, который включает даже номер сборки (я хочу иметь номер сборки).

Каждый раз, когда я собираю упомянутую dll, мне приходится изменять файл настроек проекта (.vcxproj), чтобы он ссылался на новую версию dll. Поскольку я работаю с управлением исходным кодом, это очень неудобно (разные компьютеры могут иметь разные номера сборок, поскольку каждый компьютер создает свою собственную DLL-библиотеку, на которую ссылаются, - DLL-библиотека, на которую ссылаются, не находится в системе управления версиями).

Если я не изменю ссылку, я получу предупреждение:

предупреждение MSB3245: не удалось разрешить эта ссылка. Не удалось найти сборка ...

И много таких ошибок:

ошибка C3083: «Foo»: символ слева от '::' должен быть тип

Они разрешаются после изменения ссылки.

Как заставить ссылку игнорировать номер сборки или даже весь номер версии?

1 Ответ

5 голосов
/ 04 июня 2010

В среде IDE C # для этого есть опция «Определенная версия = Ложь». Недоступно в C ++ / CLI IDE. Честно говоря, это не настоящая проблема. Возможно, вы неправильно используете атрибут [AssemblyVersion]. Эта версия связана с общедоступными классами в сборке. Если вы сделаете какие-либо изменения в открытых членах этих классов, вы получите потенциально опасное изменение, которое может привести к сбою кода, который зависит от этих классов.

В этой точке , если вы измените [AssemblyVersion]. И любой проект, который использует сборку, должен обновить свою справочную сборку и должен быть перекомпилирован.

В противном случае неразрывное изменение, такое как исправление ошибки или подстройка невидимых классов, создает новый файл, который в остальном полностью совместим с любым проектом, который его использует. Вам следует обновить номер [AssemblyFileVersion]. Который в проекте C ++ / CLI требует обновления неуправляемого ресурса Version. Изменение соответствующего файла .rc может быть автоматизировано, или вы можете использовать # define.

Обратите внимание, что базовые сборки .NET в версии 2.0 вели себя так же. Их версия [AssemblyVersion] оставалась на уровне 2.0.0.0 в версиях 3.0, 3.5 и 3.5 SP1. Их версия файла началась с 2.0.50727.42. И за последние 5 лет многократно увеличился, до 2.0.50727.4927, давай или бери.

Напомним, что ошибка VS2010, с которой вы связаны, не является ошибкой. Это просто никогда не срабатывало раньше, провал молчал. Это недостаток системы сборки C ++, mt.exe встраивает манифест после сборки со строгим именем. И ломает строгое имя в процессе, потому что это меняет хеш файла. VS2010 на самом деле является улучшением, он предупреждает об этом, а не молча пропускает сломанное строгое имя. Вам не нужно откладывать подпись, вы можете подать в отставку только с -Ra в событии после сборки.

...