Есть ли способ создавать динамические типы во время выполнения, не имея их постоянно в домене приложения? - PullRequest
2 голосов
/ 10 мая 2011

Мое текущее понимание динамически сгенерированных типов таково:

Если вы генерируете тип с помощью CodeDom и загружаете его в домен приложений, нет способа выгрузить этот тип (т. Е. Assembly.Unload(...) не существует) без разрушения домена приложения в целом.

Есть ли другие идеи о том, как создавать пользовательские типы во время выполнения?

Может ли ключевое слово C # 4.0 dynamic использоваться каким-то волшебным образом?Можно ли использовать .NET 4 ExpandoObject каким-то прекрасным способом?

Можно ли объединить анонимные типы и динамическое ключевое слово с каким-то техническим волшебством ?! чувствует как будто у нас разбросаны инструменты, которые могут принести что-то полезное.Но я могу ошибаться.

1 Ответ

2 голосов
/ 10 мая 2011

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

Вот почему CodeDom является чистым злом, когда используется в любом виде. Это гарантированная утечка памяти и проблема с производительностью. КАЖДАЯ компиляция с CodeDom генерирует новую сборку. Я думаю, у вас есть несколько вариантов:

  1. Запустите изолированную AppDomain для ваших динамических типов.

  2. Запустите основной домен приложения в среде, где допустимы повторные операции и пулы. Очевидно, что в клиентском приложении это невозможно, но если вы работаете в ASP .NET, вы можете добавить код, который отслеживает количество сборок, загруженных в ваш домен приложений, и запрашивает повторную загрузку, когда это число достигает критической точки. Тогда просто сделайте IIS пулом вашего веб-приложения, и вы по-прежнему будете иметь высокую доступность, поскольку у вас одновременно запущено несколько доменов приложений.

  3. Используйте TypeBuilder и Reflection.Emit. Это позволяет вам использовать одну динамическую сборку для всех ваших динамически генерируемых типов.

  4. Если вы хотите динамически генерировать код в стиле C #, как в CodeDom, вы все равно можете использовать его вместе с TypeBuilder, поэтому ваш динамический код C # будет скомпилирован в TypeBuilder в динамической сборке, а не в новая сборка каждый раз. Для этого вы можете использовать MCS (Mono compiler service). Вы можете передавать его в классы, отформатированные в C #, и с небольшой настройкой вы можете скомпилировать ваш код в одну динамическую сборку. См. Моно-компилятор как услуга (MCS)

...