Почему именно regasm предупреждает меня о подписании со строгим именем? - PullRequest
7 голосов
/ 01 февраля 2011

Если я хочу сделать сборку .NET пригодной для использования в качестве COM-сервера, мне нужно добавить набор атрибутов, а затем использовать regasm, чтобы зарегистрировать его в качестве COM-сервера.

Если сборка неподпись со строгим именем regasm при запуске с ключом /codebase показывает предупреждение RA0000 о том, что сборка может создавать помехи другим сборкам на том же компьютере , и я должен подписать ее строгим именем,но регистрация проходит успешно, и она даже отлично работает.

Сильные имена AFAIK предназначены для предотвращения так называемого ада DLL.Но COM должен был также предотвратить ад DLL.Если я изменяю любой интерфейс, доступный для COM, я должен либо изменить GUID, либо, по крайней мере, поддерживать двоичную совместимость.Таким образом, подписание со строгим именем, кажется, не добавляет ничего полезного - ничто не мешает мне сломать COM-интерфейсы, затем подписать с той же парой ключей и получить полноценный ад DLL.

Какая польза подписи сстрогое имя в случае COM-выставленных сборок .NET?

Ответы [ 3 ]

7 голосов
/ 01 февраля 2011

Это неуклюжее предупреждение.У COM DLL Hell есть два аспекта.Действительно плохая модификация публичных интерфейсов, а не назначение новых GUID.Клиентское приложение, которое не было перекомпилировано, имеет тенденцию аварийно завершать работу, когда оно вызывает совершенно неправильный метод, или бомбы с неприятным AccessViolationException, которое вообще не дает ни малейшего понятия, что может быть за причина.право (назначение новых идентификаторов GUID), но затем перезаписывает существующую DLL новой версией.Вы по-прежнему будете аварийно завершать работу этого устаревшего клиентского приложения, но более мягко с результатом E_NOINTERFACE, который генерирует довольно специфическое исключение, которое помогает вам диагностировать причину.Однако пользователь ничуть не счастливее.

В этом сценарии есть готовое решение в .NET, GAC поддерживает параллельное развертывание сборок с разными номерами версий, так что обастарая и новая версии могут сосуществовать, и устаревшее клиентское приложение продолжает радоваться старой версии.Что требует сильного имени.Да, это предупреждение, безусловно, могло быть подавлено, когда вы используете / codebase, так как это ясно показывает, что вы не собираетесь использовать GAC.Хотя это не повредит немного подправить нос при использовании / codebase.Кроме того, вы никогда не используете GAC на своем компьютере разработчика во время тестирования, но, безусловно, должны учитывать его при развертывании.

2 голосов
/ 01 февраля 2011

Насколько мне известно, COM не предназначался для предотвращения ада DLL, это была яма самого Аида. Термин «DLL Hell» происходит от проблемы нескольких библиотек, каждая из которых имеет методы с одинаковыми именами. Регистрация сборок COM в системном реестре не помогает с разрешением во время выполнения.

Подписание сборки, которая предназначена для работы в качестве COM-сервера, гарантирует, что сборка не столкнется с другими зарегистрированными COM-сборками на том же компьютере. Без подписи, если две COM-зарегистрированные сборки имеют методы с одинаковым именем, это может вызвать проблемы.

1 голос
/ 01 февраля 2011

Сильные наименования в основном используются для помещения Dlls в GAC. Таким образом, вы можете безопасно иметь несколько версий Dll с одним и тем же именем (!) На одном компьютере, что с обычными COM-Dll часто приводит к проблемам. Отказ от подписания Dlls удаляет возможность GAC. Из-за этого у вас нет немедленных проблем, но вы не используете полезную функцию, поэтому вы получаете предупреждение.

...