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

StackOverflow https://stackoverflow.com/questions/1618596

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Немного другой информации:

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

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top