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

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

Дополнительная информация:

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

Ответ 1

Посмотрите на эти ссылки:

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

Ответ 2

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

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false" />
    </runtime>
</configuration>

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

BTW: Еще один вариант был бы, если ваш жесткий диск полностью заполнен, а сборки EXTREMELYly фрагментированы (но в 90 секунд это было бы больше, чем я когда-либо слышал в этом случае).

Ответ 6

Попробуйте запустить приложение из visual studio с помощью "Step over". Это запустит код, перейдя через каждое приложение, чтобы вы могли проверить, что так долго. У меня когда-то было это, и оказалось, что мой сервер sql действительно перепутался.

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

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

Ответ 7

Возможно, подписанные сборки не являются NGEN'd, а беззнаковые -.