Можно ли создать / выполнить код во время выполнения в C #? - PullRequest
4 голосов
/ 19 апреля 2011

Я знаю, что вы можете динамически создавать сборку .NET, используя Emit, System.Reflection и IL-код, созданный вручную, как показано здесь .

Но мне было интересно, возможно ли динамически создавать и выполнять блок кода C # в реальном времени в работающем приложении. Спасибо за любой вклад или идеи.

Edit: Как я понимаю, CodeDOM позволяет вам компилировать код C # в файл EXE, а не просто выполнять его. Вот некоторая справочная информация и почему (насколько я могу судить) это не лучший вариант для меня. Я создаю приложение, которое должно будет выполнять такой динамически создаваемый код довольно много [для протокола - это для академических исследований, а не для реального приложения, поэтому этого нельзя избежать]. Следовательно, создание / выполнение тысяч динамически создаваемых EXE-файлов не очень эффективно. Во-вторых, все фрагменты динамического кода возвращают некоторые данные, которые трудно прочитать из отдельно запущенного EXE-файла. Пожалуйста, дайте мне знать, если я что-то упустил.

Что касается подхода DynamicMethod, на который указал Jon Skeet , все работало бы как обаяние, если бы существовал более простой способ написания самого кода, а не низкоуровневого кода IL.

Другими словами (очень резко) Мне нужно что-то вроде этого:

string x = "_some c# code here_";
var result = Exec(x);

Ответы [ 4 ]

8 голосов
/ 19 апреля 2011

Абсолютно - это именно то, что я делаю для Snippy, например, для C # в глубине.Вы можете скачать исходный код здесь - он использует CSharpCodeProvider.

Также существует возможность построения деревьев выражений, а затем компилировать их в делегаты, используя * 1008.*DynamicMethod, или DLR в .NET 4 ... все виды вещей.

1 голос
/ 19 апреля 2011

Да, это так. Есть несколько приложений, которые делают это - см. LinqPad и Snippy .

Я думаю, что они используют CSharpCodeProvider.

0 голосов
/ 19 апреля 2011

Вы можете использовать CodeDom для генерации кода и создания в памяти сборок на основе этого сгенерированного кода. Затем можно использовать в текущем приложении.

Вот краткая ссылка на ссылку на MSDN, это довольно обширный материал.

MSDN: использование CodeDom

0 голосов
/ 19 апреля 2011

Да.См. эту страницу MSDN относительно использования CodeDOM .

Некоторые примеры кода, извлеченные из вышеупомянутой страницы упоминания:

CodeEntryPointMethod start = new CodeEntryPointMethod();
CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression( 
    new CodeTypeReferenceExpression("System.Console"), 
    "WriteLine", new CodePrimitiveExpression("Hello World!") );
start.Statements.Add(cs1); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...