.net динамические сборки
Недавно меня спросили, знаю ли я что-нибудь о динамических сборках в.Net. Короткий ответ был - я не знаю.
Я нашел множество статей, в которых описывается, как создать динамическую сборку, но ни одной, которые действительно объясняют следующее:
- Что они (кроме того, что они запускаются прямо из памяти)
- Какие преимущества они предоставляют по сравнению со статическими сборками?
- Реальные примеры их использования
Любые объяснения вышеизложенного будут очень благодарны.
Большое спасибо.
2 ответа
Эта статья немного устарела, а код немного "простоват", но я бы сказал, что это одна из самых доступных статей, касающихся динамической компиляции и некоторых существенных проблем.
Именно здесь я научился компилировать сборки на лету, как в памяти, когда мне не нужно было выгружать или контролировать безопасность, так и во временный файл, который должен быть загружен с удаленным доступом, чтобы разрешить выгрузку.
Пример из реальной жизни: онлайн-инструмент регулярных выражений.net, который принимает код C# для метода-заменителя, который динамически компилируется в изолированную сборку, используется для выполнения замены и отбрасывается. Эта стратегия работала просто отлично, но вероятность внедрения вредоносного кода независимо от песочницы была слишком велика, поэтому идея была в конечном итоге отменена.
Удачи.
Я приведу несколько примеров:
ASPNET генерирует сборки и загружает их динамически для каждого ASPX, ASMX или ASHX. Настоящим преимуществом здесь является то, что код приложения может быть развернут на языке шаблонов и может динамически компилироваться и запускаться по требованию. Динамическая часть обеспечивает очень простую и удобную модель развертывания, а также означает эффективность: фактически загружаются только те страницы, которые вызываются.
DotNetZip создает динамическую сборку при сохранении самораспаковывающегося архива. На самом деле это не "запуск из памяти", это в конечном итоге записывается в файл, так что это может соответствовать или не соответствовать вашему определению для динамической сборки. Сборка создается динамически, во время выполнения. Но это не вызывается в тот момент. Зачем создавать это динамически? Поскольку исполняемый файл должен иметь возможность использовать конкретный значок Win32, ему может потребоваться номер версии и другие свойства. Эти вещи могут быть установлены во время компиляции. Кроме того, исходный код для сборки получен из шаблона, используя различные данные, предоставленные вызывающей стороной, чтобы заполнить слоты в шаблоне. Таким образом, динамически генерируемая сборка - действительно правильный путь.
В платформе веб-служб.NET ASMX компилятор wsdl.exe (или инструмент xsd.exe) будет создавать типы для сериализации / десериализации сообщений XML. Обычно он генерирует типы, в которых элементы XML моделируются как открытые поля. Но хотя DataGrid и другие связанные с данными элементы управления могут использовать массивы объектов в качестве источников данных, они отображают только открытые свойства. Поэтому приложение не может выполнить вызов веб-сервисов, вернуть массив объектов, а затем назначить его в качестве источника для сетки данных. Я использовал динамически сгенерированную сборку в качестве адаптера, чтобы позволить управляемым данными элементам управления использовать выходные данные вызовов веб-сервисов. [Эта проблема исчезла, я думаю, с ObjectDataSource и другими изменениями в.NET].
Внутри.NET создание экземпляра класса System.Xml.Serialization.XmlSerializer для определенного типа генерирует сборку динамически. Я полагаю, что выигрыш здесь такой же, как и для любого сравнения кода с интерполяцией и компиляцией. в сериализации xml основная идея состоит в том, чтобы перечислять через открытые поля и свойства типа, а затем выдавать XML-документ, который содержит значения из этих полей и реквизитов. Разве не было бы неплохо, если бы приложению не приходилось использовать System.Reflection для перечисления членов типа (очень slooooow) каждый раз, когда вызывается XmlSerializer.Serialize()?
Вот недавний вопрос SO, описывающий сценарий, когда кто-то хочет создать динамическую сборку:
Как использовать генерацию кода для динамического создания методов C#?