Как управлять созданием / компиляцией динамических объектов в .net 4.0 - PullRequest
1 голос
/ 31 марта 2011

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

Решение, которое я реализовал, состоит в том, чтобы скомпилировать исходный код строки в отдельную dll для каждого такого пользовательского алгоритма, а затем загрузить их с помощью Assembly.Load и создать экземпляр класса, сохраненного в dll.С точки зрения ремонтопригодности это означает, что мне нужно хранить исходный код в БД (например), а также управлять существованием скомпилированных dll (пересоздать, скомпилировав исходный код, если он отсутствует)

Есть ли лучший способ сделать это, учитывая новые возможности .Net 4.0?

РЕДАКТИРОВАТЬ : исходным кодом является C #, и я использую CSharpCodeProvider для компиляции кода.Все пользовательские классы являются производными от базового класса и переопределяют метод, который фактически содержит логику вычислений.Что я действительно хотел бы сделать, так это избавиться от управления dll и не потерять (слишком сильно) производительность при компиляции всех классов при каждом запуске моего приложения

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я бы посмотрел на скриптовые языки; IronPython легко внедрить, или есть механизмы JavaScript для .NET. Просто и обычно достаточно быстро.


Если (комментарии) вам нужно использовать c #, я бы:

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

Я сделал нечто похожее, когда моделью / правилами был XML, запустил его через преобразование для получения c # и компилировал с помощью CSharpCodeProvider (или чего-то еще); и просто опрашивать каждую минуту или около того, чтобы узнать, требуется ли новая сборка

1 голос
/ 31 марта 2011

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

http://www.codeproject.com/KB/dotnet/dynacodgen.aspx

...