如何获取csc.exe路径?

时间:2011-07-12 06:54:51

标签: c# .net csc

有没有办法获取最新.NET Framework的csc.exe的路径?

该文件通常位于:c:\ Windows \ Microsoft.NET \ Framework \ vX.X.XXX但问题是可以安装多个版本+有32位和64位版本。

对此有任何解决方案吗?

9 个答案:

答案 0 :(得分:26)

c:\ Windows \ Microsoft.NET \ Framework \ vX.X.XXX应包含最新的32位版本的csc.exe

c:\ Windows \ Microsoft.NET \ Framework64 \ vX.X.XXX应该包含最新的64位版本的csc.exe

无论如何,这就是我的意思。

BTW:您可以使用程序文件中visual studio tools文件夹中的Visual Studio命令行来访问这两者。它会自动设置使用csc编译器构建32位和64位应用程序所需的所有路径。

答案 1 :(得分:12)

查找 CSC.exe 路径的最佳方法是在CLI(命令行解释器)中运行该简单行:

dir /s %WINDIR%\CSC.EXE

dir - 显示目录

/ s - 包含子文件夹

%WINDIR%\ CSC.EXE - 在根文件夹中查找“CSC.exe”之类的短语。

这是我们的结果: enter image description here

然后我们可以简单地逐行编译示例代码:

C:\WINDOWS\...\v.4.0.30319\CSC.exe HelloWorld.cs

问候。

答案 2 :(得分:10)

您可以使用System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()

using System.Runtime.InteropServices;
var frameworkPath = RuntimeEnvironment.GetRuntimeDirectory();
var cscPath = Path.Combine(frameworkPath, "csc.exe");

Console.WriteLine(frameworkPath);  // C:\Windows\Microsoft.NET\Framework\v4.0.30319
Console.WriteLine(cscPath); }      // C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe

答案 3 :(得分:7)

更新:

打开命令提示符或Powershell并运行以下命令列出安装的不同.N​​et Frameworks版本的编译器的完整路径。

dir %WINDIR%\Microsoft.NET\Framework64\csc.exe /s/b

CSC Path如下:

C:\ Program Files \ MSBuild \\ Bin

例如:如果您使用的是Visual Studio 2013,则为12.0。

答案 4 :(得分:3)

如果您已经安装了Visual Studio,只需: 单击“开始”,指向“所有程序”,指向“Microsoft Visual Studio”,指向“Visual Studio工具”,然后单击“Visual Studio命令提示符” 在那里你有你的命令行框,你编译如下:

csc PathToYourCsSource

答案 5 :(得分:3)

在Developer命令提示符下,运行命令:

where csc

您将获得csc的路径,该路径与Visual Studio和net4一起安装,例如:

C:\Program Files\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe

答案 6 :(得分:1)

微软最近记录了这一点 - 请检查here

  

csc.exe可执行文件通常位于    Windows目录下的Microsoft.NET \ Framework \文件夹。   它的位置可能会有所不同,具体取决于a的确切配置   特定的电脑。如果有多个.NET Framework版本   安装在您的计算机上,您将找到多个版本   文件。

答案 7 :(得分:1)

我假设您要使用 csc.exe 来编译文件,这就是您要求路径的原因。您可以使用我创建的以下小批处理脚本来获取最新csc.exe 的路径,而不是查看注册表:

@echo off
set dotNetBase=%SystemRoot%\Microsoft.NET\Framework\
rem get latest .net path containing csc.exe:
set dotNet20=%dotNetBase%v2.0.50727\
set dotNet35=%dotNetBase%v3.5\
set dotNet40=%dotNetBase%v4.0.30319\
if exist %dotNet20%nul set dotNet=%dotNet20%
if exist %dotNet35%nul set dotNet=%dotNet35%
if exist %dotNet40%nul set dotNet=%dotNet40%
set outPath=%~DP1
set outFileName=%~n1
"%dotNet%csc.exe" /t:exe /out:%outPath%%outFileName%.exe %1 

将其另存为CompileCS.cmd并将其放在与* .cs文件相同的路径中。然后你可以简单地编译它如下:

  

<强> CompileCS GetDotNetVersion.cs

这将编译控制台应用程序GetDotNetVersion,这是一个确定已安装的.NET版本的程序,我已发布 here.

提示:如果您想在编译后自动运行C#应用程序,请将<{1}}
添加到批处理脚本的末尾。

脚本检查是否存在.NET 2.0.x,3.5和4.0.30319的系统目录 - 在其他文件夹中我从未见过csc.exe。因为它从最旧版本到最新版本进行检查,所以变量%outPath%%outFileName%.exe包含最新的现有路径。

请注意

  • Microsoft将所有4.x版本的.NET(包括最新版本4.7.1)存储在文件夹4.0.30319中。因此,如果安装了任何版本的.NET 4.x,您将在那里找到它。

  • 如果你需要 64位版本而不是32位版本,那么只需在环境中用 dotNet 替换Framework变量 Framework64 (脚本的第二行)。

  • 虽然dotNetBase仍然存在,但仅限于 C#版本5 (每次调用csc.exe时都会收到此警告)。但对于许多有用的控制台应用程序,C#5仍然没问题。如果您需要更高版本(C#6或7),那么您需要Visual Studio,或者您可以访问Roslyn GitHub area以获取Roslyn编译器源代码。

答案 8 :(得分:0)

创新。
这是他们在ReportViewer中执行的操作:

string compilerDirectory = System.IO.Path.Combine(
System.Environment.GetEnvironmentVariable("windir")
, "Microsoft.NET\\Framework" + (System.Environment.Is64BitProcess ? "64" : "")
, System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion());

C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319
"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\vbc.exe" 
"C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\csc.exe" 

但是在2018年,您最好使用roslyn内置编译器:

这里是一个示例:

         protected override System.CodeDom.Compiler.CompilerResults FromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {

#if NETSTANDARD2_0
            return NetStandardFromFileBatch(options, fileNames);
#else
            return OldFromFileBatch(options, fileNames);
#endif
        }




#if NETSTANDARD2_0         



        protected System.CodeDom.Compiler.CompilerResults NetStandardFromFileBatch(System.CodeDom.Compiler.CompilerParameters options, string[] fileNames)
        {
            //// C:\Program Files\dotnet\sdk\2.0.0\Roslyn

            //string sysver = System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion();
            //System.Console.WriteLine(sysver);


            //string pf64 = System.Environment.ExpandEnvironmentVariables("%ProgramW6432%");
            //string pf32 = System.Environment.ExpandEnvironmentVariables("%ProgramFiles(x86)%");
            //string pf = pf32;

            //if (System.IntPtr.Size * 8 == 64)
            //    pf = pf64;

            //// compilerDirectory = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles);
            ////compilerDirectory = System.IO.Path.Combine(compilerDirectory, "dotnet", "sdk", "2.0.0", "Roslyn");
            //compilerDirectory = System.IO.Path.Combine(pf32, "MSBuild", "14.0", "Bin");
            //if (System.IntPtr.Size * 8 == 64)
            //    compilerDirectory = System.IO.Path.Combine(compilerDirectory, "amd64");

            string assemblyName = System.IO.Path.GetFileNameWithoutExtension(options.OutputAssembly);

            Microsoft.CodeAnalysis.SyntaxTree[] syntaxTrees = new Microsoft.CodeAnalysis.SyntaxTree[fileNames.Length];

            for (int i = 0; i < fileNames.Length; ++i)
            {
                string fileContent = System.IO.File.ReadAllText(fileNames[i], System.Text.Encoding.UTF8);

                Microsoft.CodeAnalysis.VisualBasic.VisualBasicParseOptions op = null;

                // ERR_EncodinglessSyntaxTree = 37236 - Encoding must be specified... 
                syntaxTrees[i] = Microsoft.CodeAnalysis.VisualBasic.VisualBasicSyntaxTree.ParseText(
                    fileContent, op, fileNames[i], System.Text.Encoding.UTF8
                );

            }

            Microsoft.CodeAnalysis.MetadataReference[] references =
                new Microsoft.CodeAnalysis.MetadataReference[options.ReferencedAssemblies.Count];

            for (int i = 0; i < references.Length; ++i)
            {
                references[i] = Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(
                    options.ReferencedAssemblies[i]
                );
            }



            Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions co =
                new Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions
            (
                Microsoft.CodeAnalysis.OutputKind.DynamicallyLinkedLibrary
            );

            co.WithOptionStrict(Microsoft.CodeAnalysis.VisualBasic.OptionStrict.Off);
            co.WithOptionExplicit(false);
            co.WithOptionInfer(true);

            Microsoft.CodeAnalysis.Compilation compilation = Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilation.Create(
                assemblyName,
                syntaxTrees,
                references,
                co
            );


            System.CodeDom.Compiler.CompilerResults compilerResults = new System.CodeDom.Compiler.CompilerResults(options.TempFiles);

            compilerResults.NativeCompilerReturnValue = -1;

            // using (var dllStream = new System.IO.MemoryStream())
            using (System.IO.FileStream dllStream = System.IO.File.Create(options.OutputAssembly))
            {
                using (System.IO.MemoryStream pdbStream = new System.IO.MemoryStream())
                {
                    Microsoft.CodeAnalysis.Emit.EmitResult emitResult = compilation.Emit(dllStream, pdbStream);
                    if (!emitResult.Success)
                    {

                        foreach (Microsoft.CodeAnalysis.Diagnostic diagnostic in emitResult.Diagnostics)
                        {
                            // options.TreatWarningsAsErrors
                            if (diagnostic.IsWarningAsError || diagnostic.Severity == Microsoft.CodeAnalysis.DiagnosticSeverity.Error)
                            {
                                string errorNumber = diagnostic.Id;
                                string errorMessage = diagnostic.GetMessage();

                                string message = $"{errorNumber}: {errorMessage};";
                                string fileName = diagnostic.Location.SourceTree.FilePath;

                                Microsoft.CodeAnalysis.FileLinePositionSpan lineSpan = diagnostic.Location.GetLineSpan();
                                string codeInQuestion = lineSpan.Path;
                                int line = lineSpan.StartLinePosition.Line;
                                int col = lineSpan.StartLinePosition.Character;

                                compilerResults.Errors.Add(
                                    new System.CodeDom.Compiler.CompilerError(fileName, line, col, errorNumber, errorMessage)
                                );
                            } // End if 

                        } // Next diagnostic 

                        // emitResult.Diagnostics
                        // CheckCompilationResult(emitResult);
                    }
                    else
                    {
                        compilerResults.PathToAssembly = options.OutputAssembly;
                        compilerResults.NativeCompilerReturnValue = 0;
                    }
                }
            }

            // compilerResults.CompiledAssembly = System.Reflection.Assembly.Load(array3, null);

            return compilerResults;
        }
#endif