Как предварительно загрузить сборки .net - PullRequest
4 голосов
/ 21 октября 2010

На моей работе мы разрабатываем различные приложения, используя .net framework 4. Все приложения используют общие сборки, которые мы разработали, например слой данных в data.dll. Эти приложения находятся на сетевом диске и запускаются прямо оттуда.

Большинству крупных приложений требуется некоторое время, например, 4-5 секунд, чтобы запустить первый раз (холодный запуск). Последующие запуски происходят намного быстрее, почти мгновенно. Я не думаю, что это связано с сетью, поскольку самая большая сборка составляет около 900 КБ, а мы используем гигабитную сеть.

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

Я знаю, как создать службу, но я хотел бы знать, может ли это работать, потому что мое понимание CLR довольно ограничено ... Кроме того, было бы работать что-то вроде Assembly.LoadFrom (fileName), чтобы предварительно загрузить сборки ? Если я какое-то время не запускаю программы, остаются ли они загруженными или через некоторое время сами разгружаются? Что произойдет, если я изменю уже загруженную сборку?

По сути, я хотел бы сделать что-то вроде OpenOffice Quick Starter , но для нашей собственной прикладной среды.

Спасибо всем !!!

--- EDIT ---
Это интересно ... , кажется, идет по правильному пути, но не уверен, что я все понимаю ...

Ответы [ 4 ]

2 голосов
/ 21 октября 2010

Вы уже знаете, что JIT-компиляция не проблема, это также замедлит второй запуск. Все, что вам нужно сделать, это получить DLL в кеш файловой системы. Так что, когда вы запустите программу позже, она будет использовать копию этой DLL из кэша вместо того, чтобы копаться в подключенном к сети диске, чтобы найти ее. Что требует времени. Office Quick Start использует тот же трюк. Не уверен, кто победит, если все эти предварительно загруженные вещи больше не подходят.

Просто создайте приложение Winforms, чтобы у вас не было окна, и вызовите Assembly.Load () для загрузки сборок, File.ReadAllBytes (), чтобы убедиться, что весь контент находится в кэше. Поместите ярлык для этой программы в папку «Автозагрузка». Упомянутая вами сборка достаточно велика, чтобы получить хороший старт от Ngen.exe. Это должно выполняться на каждой отдельной рабочей станции.

1 голос
/ 21 октября 2010

Вы можете программно выполнять предварительную сборку Jit, используя методику, описанную в следующей статье: Предварительная сборка (pre-JIT) вашей сборки на лету или запуск сборок JIT заранее.

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

0 голосов
/ 21 октября 2010

То, что вы хотите, это NGEN , который предварительно компилирует сборки для вас.Я думаю, что проблема, с которой вы столкнетесь, заключается в том, что сборки из сети и, возможно, загружаются для разных архитектур ЦП.NGEN следует запускать на конечном компьютере, так как он компилируется и оптимизируется для конкретной архитектуры, используемой компьютером.

Что вы могли бы рассмотреть, так это дать строгие имена сборкам и установить их в GAC на каждом компьютере.

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

0 голосов
/ 21 октября 2010

У вас есть несколько вариантов. Предполагая, что общие сборки имеют строгие имена, они могут быть помещены в глобальный кэш сборок пользователя (GAC). Если эти сборки стабильны, вы можете создать собственный код, сгенерированный с помощью ngen.exe, который даст вам необходимый предварительный JIT-файл. Google GAC и ngen для получения дополнительной информации.

Изменить после обновления вопроса:

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

Я считаю, что комбинация GAC'а и ngen'а для ваших сборок является лучшим выбором, и оба эти шага могут быть автоматизированы (при условии, что служба работает с соответствующими разрешениями) путем извлечения сборок и выполнения внешних вызовов. в gacutil.exe и ngen.exe, используя класс System.Diagnostics.Process.

Страница MSDN для ngen.exe

Страница MSDN для gacutil.exe

Страница MSDN для Класс процесса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...