Можно ли вносить изменения в dll, сохраняя совместимость с предварительно скомпилированными исполняемыми файлами? - PullRequest
4 голосов
/ 30 сентября 2011

У нас есть много исполняемых файлов, которые ссылаются на одну из наших библиотек. Мы нашли ошибку в одной из наших библиотек и не хотим пересобирать и перераспределять все наши исполняемые файлы, чтобы исправить ее. Насколько я понимаю, dll сохранит свою совместимость с исполняемыми файлами, если вы ничего не измените в заголовочном файле. Так что никаких новых членов класса, никаких новых функций и т. Д. ... но изменение логики внутри функции должно быть в порядке. Это правильно? Если это зависит от компилятора, пожалуйста, дайте мне знать, так как это может быть проблемой.

Ответы [ 3 ]

7 голосов
/ 30 сентября 2011

Ваше понимание верно.Пока вы изменяете логику, но не интерфейс, вы не столкнетесь с проблемами совместимости.

Вы должны быть осторожны, если интерфейс к DLL - это не просто сигнатуры функций.Например, если исходная библиотека DLL приняла параметр int, но новая библиотека DLL ввела ограничение, согласно которому значение этого параметра должно быть положительным, скажем, тогда вы сломаете старые программы.

3 голосов
/ 30 сентября 2011

Это будет работать.Пока интерфейс к DLL остается прежним, старые исполняемые файлы могут загружать его и использовать его без проблем.Тем не менее, вы начинаете по очень опасной дороге.Со временем, и вы исправляете все больше и больше DLL, вы можете начать видеть странное поведение на установках клиента, которое практически невозможно диагностировать.Это происходит из-за неожиданного взаимодействия между различными версиями ваших различных компонентов.Исторически эта проблема была известна как ад DLL.

На мой взгляд, гораздо лучше перестроить, повторно протестировать и распространить все приложение.Я бы даже пошел дальше и предложил, чтобы вы использовали манифесты приложений, чтобы гарантировать, что ваши исполняемые файлы могут только работать с конкретными версиями ваших DLL.Может показаться, что сейчас много работы, но в будущем это действительно поможет вам избежать головной боли.

0 голосов
/ 30 сентября 2011

Это зависит

в теории да, если вы загрузили dll с помощью LoadLibrary и не изменили интерфейс, у вас все должно быть в порядке.

Если вы связываете OTOH с файлом .dll с помощью какой-то заглушки .lib, нет гарантии, что она будет работать.

Это одна из причин, по которой был изобретен COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...