有没有办法获取最新的.NET Framework的csc.exe的路径?
该文件通常位于:c:\ Windows\Microsoft.NET\Framework\vX.X.XXX但问题是可以安装多个版本+有32位和64位版本.
对此有何解决方案?
Liq*_*ter 27
c:\ Windows\Microsoft.NET\Framework\vX.X.XXX应包含最新的32位版本的csc.exe
c:\ Windows\Microsoft.NET\Framework64\vX.X.XXX应该包含最新的64位版本的csc.exe
无论如何,这就是我的意思.
顺便说一句:您可以使用程序文件中visual studio tools文件夹中的Visual Studio命令行来访问它们.它会自动设置使用csc编译器构建32位和64位应用程序所需的所有路径.
Bea*_*ear 12
找到CSC.exe路径的最佳方法是在CLI(命令行解释器)中运行该简单行:
dir /s %WINDIR%\CSC.EXE
Run Code Online (Sandbox Code Playgroud)
目录 - 显示目录
/ s - 包含子文件夹
%WINDIR%\ CSC.EXE - 在根文件夹中查找"CSC.exe"之类的短语.
然后我们可以简单地逐行编译示例代码:
C:\WINDOWS\...\v.4.0.30319\CSC.exe HelloWorld.cs
Run Code Online (Sandbox Code Playgroud)
问候.
Sam*_*eff 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
Run Code Online (Sandbox Code Playgroud)
nav*_*ukh 10
更新:
打开命令提示符或Powershell并运行以下命令列出安装的不同.Net Frameworks版本的编译器的完整路径.
dir %WINDIR%\Microsoft.NET\Framework64\csc.exe /s/b
CSC路径如下:
C:\ Program Files\MSBuild \\ Bin
例如:如果您使用的是Visual Studio 2013,则为12.0.
在开发人员命令提示符中,运行以下命令:
where csc
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我假设您想用于csc.exe在普通的非开发人员 PC上编译文件,这就是您要求路径的原因。
您可以使用我创建的以下小批处理脚本来获取最新可用的csc.exe的路径,而不是为此查看注册表;路径在脚本的第一部分确定,然后存储在环境变量中dotNet:
@echo off
pushd .& setlocal
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 msbuildDir=%ProgramFiles(x86)%\MSBuild\14.0\Bin\
set cscExe="%msbuildDir%csc.exe"
if not exist %cscExe% set cscExe="%dotNet%csc.exe"
::echo %cscExe%
set assemblies=
REM reference required assemblies here, copy them to the output directory after the colon (:), separated by comma
REM set assemblies=-reference:.\PresentationCore.Dll,.\WindowsBase.dll
set runArgs=%3 %4 %5 %6 %7 %8 %9
if not "%1"=="/run" (set outPath=%~DP1& set outFileName=%~n1& CALL :Compile) else (set outPath=%~DP2& set outFileName=%~n2& CALL :CompileAndRun)
GOTO :End
:Compile
echo Compiling "%outPath%%outFileName%.cs"
if exist "%outPath%%outFileName%.exe" del /F "%outPath%%outFileName%.exe"
%cscExe% -optimize+ -lib:"%dotNet%\" %assemblies% /t:exe /out:"%outPath%%outFileName%.exe" %outFileName%.cs
exit /B
:CompileAndRun
echo Compiling "%outPath%%outFileName%.cs"
if exist "%outPath%%outFileName%.exe" del /F "%outPath%%outFileName%.exe"
%cscExe% -optimize+ -lib:"%dotNet%\" %assemblies% /t:exe /out:"%outPath%%outFileName%.exe" %outFileName%.cs >nul
echo Running "%outPath%%outFileName%.exe"
"%outPath%%outFileName%.exe" %runArgs%
exit /B
:End
::::
Run Code Online (Sandbox Code Playgroud)
然后它将使用该路径调用嵌入在 Windows 中的最新可用 C# 编译器。请注意,Visual Studio 使用比 Windows 更新的 C# 编译器,对于 Windows,您只能使用 C# 版本 5。当您打算使用它编译源代码时,请记住这一点很重要。
我已经更新了代码,以便它能够使用Roslyn 而不是 Windows CSC.EXE(如果已安装)。
将其另存为CompileCS.cmd并将其放在与 *.cs 文件相同的路径中。然后你可以简单地编译它如下:
CompileCS GetDotNetVersion.cs
它将编译控制台应用程序 GetDotNetVersion,这是一个确定已安装 .NET 版本的程序,我已在此处发布。
提示:如果您想在编译后立即运行 C# 应用程序,请使用/run如下参数(如果需要,您可以在 .cs 文件末尾传递命令行参数,它们将传递给编译后的 .exe 文件):
CompileCS /run GetDotNetVersion.cs[arg1] ... [arg7]
该脚本检查 .NET 2.0.x、3.5 和 4.0.30319 的系统目录是否存在 - 在其他文件夹中我从未见过 csc.exe。因为它会从最旧的版本到最新的版本进行检查,所以该变量dotNet包含最新的现有路径。
注意
Microsoft 将 .NET 的所有 4.x 版本(包括最新版本 4.7.1)存储在文件夹 4.0.30319 中。因此,如果安装了任何版本的 .NET 4.x,您都会在那里找到它。
如果您需要64 位版本而不是 32 位版本,那么只需在环境变量(脚本的第 2 行)中替换Framework为。请注意,即使在 64 位 Windows 上,通常也会安装 32 位版本的框架,如果您真的不需要 64 位,它可以在大多数 32 位 PC 上正常工作。但是,如果您愿意,您可以添加路径是否存在的检查并支持 Framework64(就像我为 .NET 版本所做的那样)。Framework64dotNetBase
如前所述,虽然csc.exe它仍然存在,但仅限于C# 版本 5(每次调用 csc.exe 时都会收到此警告)。但是对于许多小有用的控制台应用程序,C#5 仍然很好。如果您需要更高版本(C#6、...、C#9 或更高版本),那么您将需要 Visual Studio,或者您可以访问Roslyn GitHub 区域以获取 Roslyn 编译器源代码。
如果您要引用外部程序集(*.dll 的),则需要更新代码中的以下行:set assemblies=-reference:.\PresentationCore.Dll,.\WindowsBase.dll - 只需附加您需要的任何 dll - 列表以逗号分隔。您需要将它们从dotNet路径复制到输出目录(正在创建 *.exe 的位置)。如果不需要程序集,只需将其设置为空白(即set assemblies=)。
您可以通过检查是否需要编译来增强脚本(通过比较 *.cs 文件和 *.exe 文件的文件日期/时间,并且仅当 *.cs 文件比 *.exe 文件新时才编译)。描述了如何使用批处理来完成此处了此操作。
使用 C# 编译器的另一种方法是在 C# 程序中。Microsoft在此处描述了这种方法。
我找到了一个很好的描述如何将响应文件与 CSC.exe一起使用。对于更复杂的场景,您将需要MSBUILD来自 Valve 开发人员社区的此描述向您展示了如何在不安装 Visual Studio 的情况下获得它。一探究竟 :-)
| 归档时间: |
|
| 查看次数: |
75059 次 |
| 最近记录: |