9

How to use C# 6.0 features without Visual Studio?

The following C# 6.0 Code does not work:

using static System.Console;

class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
    } 
}

Here's the Error:

>csc CS6.cs
Microsoft (R) Visual C# Compiler version 4.6.1055.0
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.

CS6.cs(1,7): error CS1041: Identifier expected; 'static' is a keyword
CS6.cs(1,14): error CS1518: Expected class, delegate, enum, interface, or struct

Here's the C# Code to determine which .NET Framework versions are installed:

using System;
using Microsoft.Win32;

class RegistryVersion
{   
    private static void GetVersionFromRegistry()
    {
         // Opens the registry key for the .NET Framework entry.
            using (RegistryKey ndpKey = 
                RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "").
                OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            {
                // As an alternative, if you know the computers you will query are running .NET Framework 4.5 
                // or later, you can use:
                // using (RegistryKey ndpKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, 
                // RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
            foreach (string versionKeyName in ndpKey.GetSubKeyNames())
            {
                if (versionKeyName.StartsWith("v"))
                {

                    RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
                    string name = (string)versionKey.GetValue("Version", "");
                    string sp = versionKey.GetValue("SP", "").ToString();
                    string install = versionKey.GetValue("Install", "").ToString();
                    if (install == "") //no install info, must be later.
                        Console.WriteLine(versionKeyName + "  " + name);
                    else
                    {
                        if (sp != "" && install == "1")
                        {
                            Console.WriteLine(versionKeyName + "  " + name + "  SP" + sp);
                        }

                    }
                    if (name != "")
                    {
                        continue;
                    }
                    foreach (string subKeyName in versionKey.GetSubKeyNames())
                    {
                        RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
                        name = (string)subKey.GetValue("Version", "");
                        if (name != "")
                            sp = subKey.GetValue("SP", "").ToString();
                        install = subKey.GetValue("Install", "").ToString();
                        if (install == "") //no install info, must be later.
                            Console.WriteLine(versionKeyName + "  " + name);
                        else
                        {
                            if (sp != "" && install == "1")
                            {
                                Console.WriteLine("  " + subKeyName + "  " + name + "  SP" + sp);
                            }
                            else if (install == "1")
                            {
                                Console.WriteLine("  " + subKeyName + "  " + name);
                            }
                        }
                    }
                }
            }
        }
    } 

    static void Main()
    {
        GetVersionFromRegistry();
    }
}

Here's the output for the C# Code to determine which .NET Framework versions are installed:

>csc FrameworkVersion.cs
Microsoft (R) Visual C# Compiler version 4.6.1055.0
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.

>FrameworkVersion.exe
v2.0.50727  2.0.50727.4927  SP2
v3.0  3.0.30729.4926  SP2
v3.5  3.5.30729.4926  SP1
v4
  Client  4.6.01055
  Full  4.6.01055
v4.0
  Client  4.0.0.0

Please note that this question is about C# 6.0 without any Visual Studio/IDE.

Community
  • 1
  • 1
Impavid
  • 435
  • 1
  • 6
  • 17
  • How do you compile that without Visual studio? Could you include your build command? – Sasha Mar 25 '16 at 09:47
  • Look at this question: http://stackoverflow.com/questions/31875825/how-to-run-roslyn-instead-csc-exe-from-command-line It's probably the same. Most likely you are running the wrong version (from wrong path) of csc.exe – Sasha Mar 25 '16 at 09:49
  • Please note that this is using Command Prompt and .NET Framework 4.6 (NDP461-KB3102436-x86-x64-AllOS-ENU.exe) and not Visual Studio. – Impavid Mar 25 '16 at 09:52
  • For those that might be interested, there is the fabulous http://www.csscript.net/ that can help a lot to achieve running C# without Visual Studio. – Larry Mar 25 '16 at 09:56

3 Answers3

4

C# 6 is not build towards a specific framework version, it all depends on the compiler. If you use the C# 6 compiler, you can compile that snippet.

Make sure you have installed the latest MSBuild version on your build machine (they moved the compiler from the framework folder). That installation contains the latest compiler. (Clients don't need to run the latest framework version if your project is specified to build for a lower framework version)

You can also install the compiler NuGet package using the NuGet command line.

Useful resources:

Patrick Hofman
  • 153,850
  • 22
  • 249
  • 325
3

Your problem is with the compiler

>csc CS6.cs
Microsoft (R) Visual C# Compiler version -->4.6.1055.0<--
for Microsoft (R) .NET Framework 4.5

You are using the 4.6 compiler when you need the 6 compiler.

C# 6 compiler is installed with Visual Studio, however looks like someone managed to install it regardless of IDE

https://social.msdn.microsoft.com/Forums/vstudio/en-US/9959d4c1-16fe-45bc-9535-7b0775d26e9a/please-confirm-c-60-compiler-is-not-installed-with-net-framework-46-if-so-location?forum=csharpgeneral

http://www.microsoft.com/en-us/download/details.aspx?id=48159 Microsoft Build Tools 2015 It says it only depends on .NET Framework 4.5... I guess the Roslyn-based C# 6.0 compiler can target .NET Framework 4.5? What is this thing's relationship to the .NET Framework 4.6 Targeting pack? Will that install this? Or are both needed? And like I said, can I compile using C# 6 language features in VS2013?
usr-local-ΕΨΗΕΛΩΝ
  • 26,101
  • 30
  • 154
  • 305
2

Try to use compilers from these locations:

%ProgramFiles(x86)%\MSBuild\12.0\Bin\
%ProgramFiles(x86)%\MSBuild\12.0\Bin\amd64\
%ProgramFiles(x86)%\MSBuild\14.0\Bin\
%ProgramFiles(x86)%\MSBuild\14.0\Bin\amd64\
Qwertiy
  • 19,681
  • 15
  • 61
  • 128