Reputation:
I would like to compile c# source code from a string. I know this is possible using CodeDom, and I would like to know if it's possible to do this using the command line compiler. For example, say I load the following code onto a string:
static void Main(string[] args)
{
}
Is there some way to compile this code into a c# executable (.exe) file without first writing this code to my hard drive in the form of a C# class (.cs) file?
That was the first part of my question. The second part assumes that the above is in fact impossible. Let's say I had three difference classes (loaded onto three separate strings). How would I go about using the Command line compiler to compile each of these three classes into one common executable file? I have found some examples online, but they seem to be very vague, unfortunately.
Any help, or pointers in the right direction is much appreciated.
Thank you, Evan
Upvotes: 4
Views: 1585
Reputation: 283911
No, you can't use csc.exe without a source file. What is your rationale for needing to use csc.exe? Have you found something that the CodeDOM doesn't handle correctly? A command-line option you don't have a CodeDOM equivalent for?
The C# team mentioned that a future version might support compiler-as-a-service, where csc.exe would just become a thin wrapper around a compiler DLL, that you could also call directly. But you'd still need to bypass csc.exe.
You can use System.CodeDom.Compiler.CompilerParameters
to get CodeDOM to give you the same results as csc.exe. Check the build log to find out what options Visual Studio is passing to csc.exe. Specifically, the architecture (AnyCPU
vs x86
) is likely to make a big difference, since it determines whether the resulting assembly will be compatible with 32-bit DLLs when run on Windows x64. Or you can use corflags
to fix the architecture after compilation.
Upvotes: 3
Reputation: 17909
I was looking to see if you could direct CSC to compile from STDIN but I can't seem to see that, so I think Part one isn't likely to be the case.
However, part two is easier.
a command such as
csc /out:test.exe *.cs
Compiles all .CS files in the current directory into test.exe. You can find other examples here:
http://msdn.microsoft.com/en-us/library/78f4aasd.aspx
Edit: I just thought of a horrible hack that might help. This is horrible however! What about creating your file as some kind of UNC/Service url. My thinking is that you could associate a NetworkStream to a UNC or an endpoint of some HttpHandler or webservice; once read from you would simply return the string to the stream.
This is really hacky though and I have no idea if it'll work!
Upvotes: 2