Динамическая генерация кода - PullRequest
5 голосов
/ 17 ноября 2009

В настоящее время я занимаюсь разработкой приложения, в котором вы можете создавать «программы» без написания исходного кода, просто нажмите и играйте, если хотите.

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

  1. Класс CodeDOM: я слышал о множестве ограничений и ошибок этого класса. Мне нужно создать атрибуты для параметров метода и возвращаемых значений. Это поддерживается?

  2. Создайте исходный код C # программно, а затем вызовите для него CompileAssemblyFromFile: это будет работать, поскольку я могу генерировать любой код, который я хочу, и C # поддерживает большинство функций CLR. Но разве это не будет медленным?

  3. Используйте класс отражения ILGenerator: я думаю, что с помощью этого я могу генерировать любой возможный код .NET. Но я думаю, что это намного сложнее и подвержено ошибкам, чем другие подходы?

  4. Есть ли другие возможные решения?

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

Ответы [ 6 ]

4 голосов
/ 17 ноября 2009

Вам может показаться полезным взглянуть на Dynamic Language Runtime , который более или менее предназначен для создания языков высокого уровня на основе .NET.

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

2 голосов
/ 17 ноября 2009

Большинство вещей «кликни и играй» должно быть достаточно простым, чтобы просто соединить некоторые заранее определенные объекты строительных блоков (возможно, с использованием интерфейсов на границах). Значение: вам может не потребоваться динамическая генерация кода - просто «подделайте». Например, использование объектов пакета свойств (например, DataTable и т. Д., Хотя это не мой первый выбор) для значений и т. Д.

Другой вариант для динамической оценки - это класс Expression; особенно в .NET 4.0, он чрезвычайно универсален и позволяет компилировать делегату.

1 голос
/ 17 ноября 2009

Когда я писал динамический генератор кода, я сильно полагался на System.Reflection.Emit.

По сути, вы программно создаете динамические сборки и добавляете в них новые типы. Эти типы создаются с использованием конструкций Emit (свойства, события, поля и т. Д.). Когда дело доходит до реализации методов, вам придется использовать ILGenerator для накачки оп-кодов MSIL в ваш метод. Это звучит очень страшно, но вы можете использовать несколько инструментов, чтобы помочь:

  • Готовый пример реализации
  • ILDasm для проверки кодов операций примера реализации.
1 голос
/ 17 ноября 2009

Создайте исходный код на C # и не заботьтесь о скорости, пока это не имеет значения. Компилятор C # довольно быстрый.

0 голосов
/ 24 ноября 2009

Я бы повторил это в том, что 1) компилятор работает быстро, и 2) все, что нужно для «кликай и играй», должно быть достаточно простым, чтобы ни один виджет, добавленный к куче виджетов, не мог превратить его в недопустимую кучу.

Удачи. Я скептически отношусь к тому, что вы можете получить балл (2) за что угодно, кроме действительно игрушечных программ.

0 голосов
/ 17 ноября 2009

В зависимости от ваших требований, CodeDOM, безусловно, лучше всего подойдет для «программы», хранящей ее в «модели данных».

Однако маловероятно, что использование варианта 2 будет заметно медленнее по сравнению с любым другим подходом.

...