С# csc компилирует исходный код из памяти

86
10

Я хотел бы скомпилировать исходный код С# из строки. Я знаю, что это возможно с помощью CodeDom, и я хотел бы знать, можно ли это сделать с помощью компилятора командной строки. Например, скажем, я загружаю следующий код в строку:


static void Main(string[] args)
{

}


Есть ли способ скомпилировать этот код в файл aС# executable (.exe) без, сначала записывая этот код на мой жесткий диск в виде файла класса С# (.cs)?


Это была первая часть моего вопроса. Вторая часть предполагает, что это на самом деле невозможно. Скажем, у меня было три разностных класса (загружено на три отдельные строки). Как я могу использовать компилятор командной строки для компиляции каждого из этих трех классов в один общий исполняемый файл? Я нашел несколько примеров в Интернете, но они, похоже, очень расплывчаты, к сожалению.


Любая помощь, или указатели в правильном направлении, очень ценится.


Спасибо,
Эван

спросил(а) 2021-01-28T00:10:41+03:00 1 месяц назад
1
Решение
85

Нет, вы не можете использовать csc.exe без исходного файла. Каково ваше обоснование необходимости использования csc.exe? Вы нашли что-то, что CodeDOM не обрабатывает правильно? Параметр командной строки у вас нет эквивалента CodeDOM для?


Команда С# упомянула, что будущая версия может поддерживать compiler-as-a-service, где csc.exe просто станет тонкой оболочкой вокруг DLL компилятора, что вы также можете звоните напрямую. Но вам все равно нужно обойти csc.exe.

Вы можете использовать System.CodeDom.Compiler.CompilerParameters, чтобы получить CodeDOM, чтобы дать вам те же результаты, что и csc.exe. Проверьте журнал сборки, чтобы узнать, какие параметры Visual Studio переходят на csc.exe. В частности, архитектура (AnyCPU vs x86) может сильно повлиять, поскольку она определяет, будет ли результирующая сборка совместима с 32-разрядными DLL при запуске в Windows x64. Или вы можете использовать corflags для исправления архитектуры после компиляции.

ответил(а) 2021-01-28T00:10:41+03:00 1 месяц назад
74

Я искал, можно ли направить CSC для компиляции из STDIN, но я не вижу этого, поэтому я думаю, что часть первая вряд ли будет иметь место.


Однако вторая часть проще.


команда, такая как


csc /out:test.exe *.cs

Скомпилирует все .CS файлы в текущем каталоге в test.exe.
Здесь вы можете найти другие примеры:


http://msdn.microsoft.com/en-us/library/78f4aasd.aspx


Изменить: Я просто подумал о ужасном хаке, который может помочь. Это ужасно!
Как создать файл в качестве своего рода URL-адреса UNC/Service. Мое мышление заключается в том, что вы можете связать NetworkStream с UNC или конечной точкой некоторого HttpHandler или webservice; после того, как вы прочитали от вас, вы просто вернете строку в поток.


Это действительно взломанно, и я понятия не имею, будет ли это работать!

ответил(а) 2021-01-28T00:10:41+03:00 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема