C#csc从内存中编译源代码

时间:2011-08-15 00:05:36

标签: c# compiler-construction

我想从字符串中编译c#源代码。我知道这可以使用CodeDom,我想知道是否可以使用命令行编译器来完成这项工作。例如,假设我将以下代码加载到字符串中:

static void Main(string[] args)
        {           

        }

有没有办法将此代码编译成ac#可执行文件(.exe)文件,而首先以C#类(.cs)文件的形式将此代码写入我的硬盘驱动器?< / p>

这是我提问的第一部分。第二部分假设上述事实上是不可能的。假设我有三个不同的类(加载到三个不同的字符串)。我如何使用命令行编译器将这三个类中的每一个编译成一个公共可执行文件?我在网上找到了一些例子,但遗憾的是它们似乎很模糊。

非常感谢任何帮助或正确方向的指示。

谢谢你, 埃文

2 个答案:

答案 0 :(得分:3)

不,如果没有源文件,则无法使用csc.exe。你需要使用csc.exe的理由是什么?您是否找到了CodeDOM无法正确处理的内容?命令行选项,您没有与?

等效的CodeDOM

C#团队提到未来版本可能支持compiler-as-a-service,其中csc.exe只会成为编译器DLL的瘦包装,您也可以直接调用它。但是你仍然需要绕过csc.exe。

您可以使用System.CodeDom.Compiler.CompilerParameters让CodeDOM为您提供与csc.exe相同的结果。检查构建日志以找出Visual Studio传递给csc.exe的选项。具体来说,体系结构(AnyCPU vs x86)可能会产生很大的不同,因为它确定在Windows x64上运行时生成的程序集是否与32位DLL兼容。或者您可以在编译后使用corflags来修复体系结构。

答案 1 :(得分:2)

我当时想看看你是否可以指示CSC从STDIN编译,但我似乎无法看到,所以我认为第一部分可能不是这样。

然而,第二部分更容易。

诸如

之类的命令
csc /out:test.exe *.cs

将当前目录中的所有.CS文件编译为test.exe。 您可以在此处找到其他示例:

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

编辑:我只是想到一个可能有帮助的可怕黑客。这太可怕了! 如何将文件创建为某种UNC / Service URL。我的想法是你可以将NetworkStream关联到UNC或某个HttpHandler或webservice的端点;一旦从您那里读取,只需将字符串返回到流中即可。

这真的很酷,我不知道它是否会起作用!