C#csc从内存编译源代码

C#csc从内存编译源代码,c#,compiler-construction,C#,Compiler Construction,我想从字符串编译c#源代码。我知道使用CodeDom可以做到这一点,我想知道是否可以使用命令行编译器做到这一点。例如,假设我将以下代码加载到字符串上: static void Main(string[] args) { } 是否有某种方法可以将此代码编译成c#可执行(.exe)文件,而无需先将此代码以c#类(.cs)文件的形式写入我的硬盘 这是我问题的第一部分。第二部分假设上述事实上是不可能的。假设我有三个不同的类(加载到三个单独的字符串

我想从字符串编译c#源代码。我知道使用CodeDom可以做到这一点,我想知道是否可以使用命令行编译器做到这一点。例如,假设我将以下代码加载到字符串上:

static void Main(string[] args)
        {           

        }
是否有某种方法可以将此代码编译成c#可执行(.exe)文件,而无需先将此代码以c#类(.cs)文件的形式写入我的硬盘

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

非常感谢您的任何帮助或正确方向的指点

谢谢,,
Evan

我想看看您是否可以指导CSC从STDIN编译,但我似乎看不到这一点,所以我认为第一部分不太可能是这样

然而,第二部分比较容易

命令,如

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

编辑:我刚想到一个可怕的黑客可能会有所帮助。然而,这太可怕了! 将文件创建为某种UNC/服务url怎么样。我的想法是,您可以将NetworkStream与UNC或某个HttpHandler或webservice的端点相关联;一旦从中读取,您只需将字符串返回到流


这是真的黑客虽然,我不知道它是否会工作

不,没有源文件,您不能使用csc.exe。您需要使用csc.exe的理由是什么?你有没有发现CodeDOM不能正确处理的东西?一个命令行选项,你没有一个CodeDOM等价物吗

C#团队提到,未来的版本可能支持csc.exe,它将成为编译器DLL的薄包装,您也可以直接调用它。但您仍然需要绕过csc.exe


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

为什么要使用命令行编译器而不是编译器类?我不想使用CodeDom,因为它最近导致了一些错误。另外,我对这一点有点好奇。使用CodeCompiler.FromSource()。它需要一个字符串。@Hans-这不是CodeDom的一部分吗?我想使用CSC.exeColor,我很惊讶,它是System.CodeDom.CodeCompiler类。这条评论背后一定有一个真正的问题,我还看不到。你知道我如何向test.exe添加嵌入式资源吗?是的,有点;你可以添加/res:myResource.ext-澄清一下,我想你就是这样做的,我无法测试,因为我现在在mac上;我很想知道它是否有效!Aww:(我确实回答了张贴的问题!grr我知道-但他的回答最终确实解决了我的问题。很抱歉,是的,我有一个使用指针并调用数据的项目。出于某种原因,当我使用CodeDom编译此源代码时,输出在Windows 7 64位上失败。然而,当我使用Visual Studio编译确切的源代码时,程序工作正常。)在windows 7 64位上。@Evan:可能一个使用的是
AnyCPU
,另一个使用的是
x86
?用于检查。是的,Visual Studio使用的是x86,CodeDom使用的是任何CPU。根据我的发现,不是应该相反吗?@Evan:不,即使在windows x64上,
x86
一个也与32位DLL兼容。另一方面,
AnyCPU
在Windows x64上作为64位进程加载,然后32位DLL无法使用。因此,现在您只需找到CodeDOM的
x86
选项,或者在生成的可执行文件上运行
corflags
。如果您做出了回答,我会接受它。我的问题刚刚解决!