Почему подписанные сборки загружаются медленно?

На этой неделе я столкнулся со странной проблемой, которую не могу объяснить: я переключил свое приложение на использование подписанной версии некоторых сторонних сборок (Xceed Grid и некоторых других их компонентов), и время запуска приложения ушло в унитаз. Каждый раз, когда приложение загружало подписанную сборку, загрузка занимала 30 секунд. Запуск приложения увеличился с 5 секунд до более чем 90 секунд. Какого черта здесь происходит?!

Некоторая другая информация:

  • Это приложение WinForms, работающее под управлением .NET 3.5 SP1.
  • Компьютер не имел подключения к интернету (нарочно, в целях безопасности).

person Mike Post    schedule 24.10.2009    source источник
comment
Изменили ли вы какие-либо параметры среды выполнения? В частности, на каком уровне доверия вы выполняете приложение? Дефолт?   -  person Foxfire    schedule 24.10.2009
comment
Как вы проверяли время загрузки?   -  person anishMarokey    schedule 24.10.2009
comment
В Internet Explorer перейдите в «Параметры» -> «Дополнительно». Снимите флажок Проверять отзыв сертификата издателя, это помогало мне в подобных ситуациях в прошлом...   -  person ParmesanCodice    schedule 24.10.2009


Ответы (7)


Взгляните на эти ссылки:

Они могут помочь. Возможно, конфигурация вашей системы означает, что платформа .NET выполняет много дополнительной работы для проверки сборки. Если это так, то вы можете настроить его, чтобы он не был таким придирчивым.

person Jason Evans    schedule 24.10.2009
comment
Кроме того, свяжитесь с автором сборки, если у него есть другие клиенты, сообщившие о той же проблеме. У них может быть раздел FAW на их сайте или что-то в этом роде. - person Jason Evans; 24.10.2009
comment
Спасибо, это была именно проблема! Перехожу к сообщениям на форумах Xceed, чтобы никому больше не пришлось страдать от такой же боли. - person Mike Post; 28.10.2009

Сообщение Джейсона Эванса действительно содержит ответ, но в виде ссылки. Я подумал, что было бы хорошо опубликовать фактическое решение здесь:

Создайте файл Appname.exe.config в той же папке, что и исполняемый файл (где Appname — это имя вашего исполняемого файла; для разработки это будет папка вывода отладки). Это показывает файл xml, который предполагает, что у вас нет других записей в основном файле конфигурации; если у вас уже есть файл, я предполагаю, что вы просто добавите новые разделы/текст по мере необходимости:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false" />
    </runtime>
</configuration>
person MartinKB    schedule 13.01.2010
comment
Спасибо Уилл. Кстати, я вижу, что мне, вероятно, следовало опубликовать свой ответ в качестве комментария к ответу Джейсона Эванса. Я не хотел опережать его пост. [Дох! Какой новичок!] - person MartinKB; 13.01.2010
comment
Спасибо за ответ! Я все еще думаю, что ссылка является окончательным ответом, потому что она содержит код, объяснение проблемы и подробное объяснение того, как проверить проблему. - person Mike Post; 15.01.2010

На всякий случай, если кто-то еще наткнется на этот пост, я проследил проблему немного дальше, потому что я просто пытался понять это и нашел эту страницу.

Похоже, что CRL проверяется каждый раз, когда вы запускаете свой процесс, если срок действия существующего CRL на вашем компьютере истек, и он еще не обновлен новым. Вы можете проверить это, нажав CRL по адресу http://crl.microsoft.com/pki/crl/products/CodeSignPCA.crl и проверьте срок действия. Теперь настройте прокси в IE, который не работает. Установите дату вашего компьютера после даты истечения срока действия и повторно протестируйте приложение.

Если ваша сетевая карта отключена, CRL не проверяется.

Если у вашей сетевой карты нет шлюза, CRL не проверяется.

Если у вас включен прокси-сервер и шлюз, то проверяется CRL, и если есть проблема с прокси-сервером, вы столкнетесь с этим тайм-аутом.

Если вы успешно подключитесь к Интернету, CRL обновится, и на данный момент все будет в порядке.

Мое приложение использовало некоторые старые компоненты Xceed в .NET 2.0 и работало всегда, поэтому потребовалось некоторое время, чтобы понять, что происходит.

person Paul Farry    schedule 13.09.2011

Загрузка подписанных сборок определенно будет медленнее, чем неподписанных копий, потому что подпись должна быть проверена, но это должно быть совершенно незначительным.

Переход с 5 секунд на 90 секунд?? Думаю, вам нужно связаться с автором сборки и спросить у них, меняли ли они только подпись :-)

person Darin Dimitrov    schedule 24.10.2009
comment
Причина 90 секунд в том, что тестовая машина не была подключена к Интернету, поэтому истекло время ожидания. (Это может звучать как сумасшедшая болтовня, но в некоторых сценариях это вполне справедливо.) - person Mike Post; 13.09.2011

Я предполагаю, что у вас настроены параметры безопасности таким образом, чтобы сертификаты сборок проверялись. Таким образом, он, вероятно, пытается получить доступ к Интернету, чтобы проверить какой-либо сертификат, а затем ждет тайм-аута (30 секунд - это ОЧЕНЬ типичное число тайм-аута).

Вы можете убедиться в этом, если посмотрите, что происходит за эти 30 секунд. Чтобы мое предположение было правдой, в эти 90 секунд должно быть мало использования ЦП и мало обращений к жесткому диску. Если у вас высокая загрузка процессора или жесткий диск, то это что-то другое.

Кстати: Другой вариант - если ваш жесткий диск полностью заполнен, а сборки ЧРЕЗВЫЧАЙНО фрагментированы (но в этом случае 90 секунд будет больше, чем я когда-либо слышал).

person Foxfire    schedule 24.10.2009

Попробуйте запустить приложение из визуальной студии с помощью «Перешагнуть». Это запустит код, перебирая каждое приложение, чтобы вы могли проверить, что занимает так много времени. У меня когда-то было такое, и оказалось, что мой sql-сервер действительно испорчен.

Еще один способ узнать, почему это занимает так много времени, — поставить точки останова, разбросанные по коду загрузки, и посмотреть, в чем узкое место. Если приложению требуется 90 секунд, прежде чем оно ваше сначала понравится, возможно, что-то с XCeed или загрузка подписанных сборок.

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

person Henri    schedule 24.10.2009

Возможно, подписанные сборки не имеют NGEN, а неподписанные.

person leppie    schedule 24.10.2009
comment
Не уверен, но он говорит о 90!! секунды. Ngen никогда не окажет такого огромного влияния, если только размер сборки не будет (буквально) ГБ. - person Foxfire; 24.10.2009