Использование жесткого связывания Ngen (DependencyAttribute)

Некоторый контекст

Когда мое приложение установлено, программа установки вызывает Ngen для всех сборок, которые оно развертывает. Это было сделано для сокращения времени запуска, и оно работает довольно хорошо (на моей машине это время сокращается с 22 до 14 секунд). Это приложение.NET 4.0 x86 WPF, использующее около 40 сборок (большинство из которых сторонние), размер всех сборок составляет около 45 МБ.

Теперь я применил некоторые атрибуты DependencyAttributes к своему коду, чтобы включить жесткую привязку ( объяснение в MSDN). Причиной этого является загрузка некоторых сторонних сборок во время запуска, которые в противном случае не были бы загружены, пока пользователь не откроет первое окно ввода данных. Да, я знаю, что это замедлит время запуска моего приложения, но это нормально, если оно уменьшает время, необходимое для открытия первого окна ввода данных.

Вопросы

1) Есть ли способ проверить, было ли загруженное исходное изображение загружено как жесткая или обычная / мягкая привязка?

2) (Если ответ на первый вопрос положительный, я могу проверить это сам.) Если у меня есть AssemblyA, которая определяет [assembly: Dependency("AssemblyB", LoadHint.Always)] и AssemblyB, который определяет [assembly: Dependency("AssemblyC", LoadHint.Always)]Будет ли загрузка AssemblyA также загружать AssemblyC с жесткой привязкой (при условии, что все три имеют действительные собственные изображения)? Или мне нужно указать прямые жесткие зависимости для всех зависимых сборок? Потому что, если я сделаю ngen display /verbose эти косвенные зависимости не перечислены как прямые жесткие зависимости, только как жесткие зависимости зависимости.

3) Я только что обнаружил, что не могу определить сборку как жесткую зависимость, если эта сборка не используется непосредственно в моей сборке (сообщение от ngen install /verbose: ПРЕДУПРЕЖДЕНИЕ: Невозможно жестко привязать к ThirdPartyAssemblyB, поскольку он не загружен). Так что мой проект ссылается на ThirdPartyAssemblyA и ThirdPartyAssemblyB, но не использует никаких классов из ThirdPartyAssemblyB. Но ThirdPartyAssemblyB все еще необходим во время выполнения, потому что ThirdPartyAssemblyA использует его. Используя.NET Reflector, я вижу, что компилятор удалил мою ссылку на ThirdPartyAssemblyB. И используя ngen display /verbose Я вижу, что моя сборка не имеет прямой зависимости от ThirdPartyAssemblyB, ни жесткой, ни мягкой. Конечно, у него все еще есть косвенная зависимость от ThirdPartyAssemblyA (которая является жесткой зависимостью), но поскольку ThirdPartyAssemblyA не имеет жесткой зависимости от ThirdPartyAssemblyB, это не помогает. Мне действительно нужно создать какой-нибудь фиктивный код, который напрямую ссылается на ThirdPartyAssemblyB, просто чтобы получить жесткую привязку к нему?

4) По какой-то причине ngen install MyAssembly /verbose выводит следующее предупреждение: "ПРЕДУПРЕЖДЕНИЕ. Невозможно выполнить жесткую привязку к PresentationFramework, версии =4.0.0.0, Culture= нейтральный, PublicKeyToken=31bf3856ad364e35, поскольку у зависимости нет собственного изображения (проверьте причину FusLogVw)". Но у меня есть встроенный образ PresentationFramework, и с помощью Fuslogvw я вижу, что он загружается во время выполнения. После установки родных образов ngen display /verbose даже перечисляет PresentationFramework как жесткую зависимость моей сборки. Так что же означает это предупреждение?

0 ответов

Другие вопросы по тегам