2012-04-04 3 views
0

Я помню код InterSystems Cache, вы можете использовать косвенность, чтобы взять строку и превратить ее в настоящий исполняемый код, перед строковой переменной с помощью «@». Это можно сделать в коде C# .NET или VB.NET? Поэтому я хотел бы иметь метод, который будет принимать массив аргументов из строк (с одной или несколькими строками кода) и запускать этот код, предполагая, что это не исключает, конечно. Куда я иду с этим? Я пытаюсь написать компилятор в .NET-коде.Можете ли вы выполнить кодовое обозначение в .NET?

SET x="set a=3" XECUTE x ; sets the public variable a to 3 

OR 

SET x="tag1" d @x ; do/call the public subroutine tag1 

OR 

Set Y = "B",@Y = 6 ; sets public variable B = 6 
+2

Взгляните на Roslyn http://msdn.microsoft.com/en-us/roslyn – cordialgerm

+0

Мне нравится, как неясный Caché - тот, который вы выбрали, например, для косвенности. Вы случайно не работали в компании здравоохранения? –

+0

Ха-ха! Я, я работал в Epic в течение 5,5 лет. Ты тоже? – MacGyver

ответ

1

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

+0

Прохладный! Это эквивалентно вызову csc * из командной строки? Или запускать msbuild * .sln .. из кода .NET? – MacGyver

+1

Это скриптинг - таким образом, это компиляция во время выполнения.
csc означает встроенную компиляцию во время компиляции. – weismat

+0

Вы рекомендуете какие-либо ссылки/ссылки на некоторые авторитетные примеры использования этого пространства имен? Я буду играть с ним, в то же время. – MacGyver

1

Для .NET вы можете либо программно создавать код с использованием System.CodeDom, который в основном представляет собой оболочку на промежуточном языке, либо вы можете использовать System.CodeDom.Compiler для получения объекта, который компилирует строку (или файл) в исполняемый файл или DLL с использованием компилятора C# или VB.NET.

Компиляция строки больше похожа на способ использования Intersystems Cache, но это еще больше работает, потому что вы должны предоставить всю информацию, необходимую компилятору. Если вы посмотрите на the CompilerParameters class, вы увидите дополнительную сложность. Скомпилированный код будет в собственной сборке. Сборка не может быть выгружена, если она не находится в собственном домене приложений, и при динамической компиляции ее достаточно сложно, чтобы большинство людей не беспокоилось, могут ли они ее избежать.

Предлагаются различные подходы к решению проблемы on this very site.

Некоторые исходные тексты для одного решения, которое вы описали, можно найти here, если ссылка остается в живых.

+0

это возможно в Java? :-) – MacGyver

Смежные вопросы