4

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

10
  • Why do you want to use the command line compiler instead of the compiler classes? Commented Aug 15, 2011 at 0:07
  • I don't want to use CodeDom because it has been causing a few bugs lately. Also, I'm slightly curious at this point. Commented Aug 15, 2011 at 0:07
  • Use CodeCompiler.FromSource(). It takes a string. Commented Aug 15, 2011 at 0:09
  • @Hans - is this not part of CodeDom? I want to use CSC.exe Commented Aug 15, 2011 at 0:12
  • Color me surprised, it is the System.CodeDom.CodeCompiler class. There has to be a real question behind that comment, I can't see it yet. Commented Aug 15, 2011 at 0:14

2 Answers 2

3

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.

Sign up to request clarification or add additional context in comments.

5 Comments

Yes, I have a project which uses pointers, and invokes data. For some reason when I compile this source using CodeDom, the output fails on Windows 7 64 bit. However, when I compile the EXACT source code using Visual Studio, the program works on windows 7 64 bit.
@Evan: Maybe one is using AnyCPU and the other is x86? Use corflags to check.
Yes, Visual Studio is using x86, CodeDom is using any CPU. Shouldn't it be the opposite though based on my findings?
@Evan: Nope, the x86 one is compatible with a 32-bit DLL even on Windows x64. On the other hand, AnyCPU loads as a 64-bit process on Windows x64, and then the 32-bit DLL cannot be used. So now you just need to find the x86 option for CodeDOM, or run corflags on the resulting executable.
If you made this an answer I would accept it. Just solved my issue!
2

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!

5 Comments

Do you know how I can add embedded resources to test.exe?
Yes, well kind of; you would add /res:myResource.ext - to clarify, I think this is how you do it, I can't test as I'm on my mac at the moment.
Just updated my answer with a horribly hacky suggestion; I would love to know if it works!
Aww :( I did answer the posted question!
grr I know - but his answer truly did solve my problem in the end. Sorry

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.