Je suppose que vous voulez utiliser csc.exe
pour compiler des fichiers sur un PC ordinaire, sans développeur, c'est pour cela que vous demandiez le chemin.
Plutôt que de chercher dans le registre, vous pouvez utiliser le petit fichier batch suivant script que j'ai créé pour obtenir le chemin d'accès au fichier dernier csc.exe disponible ; le chemin est déterminé dans la première section du script et puis stocké dans la variable d'environnement 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
::::
Il utilisera ensuite ce chemin pour invoquer le dernier compilateur C# disponible intégré dans Windows. Notez que Visual Studio utilise des compilateurs C# plus récents que Windows. Avec Windows, vous êtes limité à la version 5 de C#. Il est important de garder cela à l'esprit lorsque vous avez l'intention de compiler du code source avec Visual Studio.
J'ai mis à jour le code de manière à ce qu'il puisse utiliser Roslyn au lieu de Windows CSC.EXE s'il est installé.
Sauvegarder en tant que CompileCS.cmd
et placez-le dans le même chemin que vos fichiers *.cs. Ensuite, vous pouvez simplement le compiler comme suit :
CompileCS GetDotNetVersion.cs
Ce qui compilera l'application console GetDotNetVersion, un programme pour déterminer les versions .NET installées, que j'ai publié ici.
Indice : Si vous voulez exécuter immédiatement l'application C# après la compilation, utilisez la fonction /run
comme suit (vous pouvez passer des arguments de ligne de commande à la fin du fichier .cs si nécessaire, ils seront transmis au fichier .exe compilé) :
CompileCS /run GetDotNetVersion.cs
[arg1] ... [arg7]
Le script vérifie l'existence des répertoires système pour .NET 2.0.x, 3.5 et 4.0.30319 - dans d'autres dossiers, je n'ai jamais vu csc.exe. Comme il effectue la vérification de la version la plus ancienne à la plus récente, la variable dotNet
contient le dernier chemin existant.
Il convient de noter que
-
Microsoft stocke toutes les versions 4.x de .NET - y compris la dernière version 4.7.1 - dans le dossier 4.0.30319. Par conséquent, si une version de .NET 4.x est installée, vous la trouverez dans ce dossier.
-
Si vous avez besoin de la Version 64 bits plutôt que la version 32 bits, remplacez simplement Framework
par Framework64
dans la variable d'environnement dotNetBase
(2ème ligne du script). Notez que même sous Windows 64 bits, une version 32 bits du framework est généralement installée et si vous n'avez pas vraiment besoin d'avoir 64 bits, il fonctionnera parfaitement sur la plupart des PC 32 bits. Cependant, vous pouvez ajouter une vérification de l'existence du chemin et favoriser Framework64 si vous préférez cela (comme je l'ai fait pour les versions .NET).
-
Comme nous l'avons déjà dit, bien que les csc.exe
existe toujours, il est limité à C# version 5 (vous recevrez cet avertissement chaque fois que vous invoquerez csc.exe). Mais pour de nombreuses applications de console peu utiles, C#5 est encore très bien. Si vous avez besoin d'une version supérieure (C#6, ..., C#9 ou plus) Pour cela, vous aurez besoin de Visual Studio ou vous pouvez visiter le site Web de Zone GitHub de Roslyn pour obtenir le code source du compilateur Roslyn.
-
Si vous faites référence à les assemblages externes (*.dll's), vous devrez mettre à jour la ligne suivante dans le code : set assemblies=-reference:.\PresentationCore.Dll,.\WindowsBase.dll
- il suffit d'ajouter les dll dont vous avez besoin - la liste est séparée par des virgules. Vous devez les copier depuis le fichier dotNet
chemin d'accès au répertoire de sortie (où le fichier *.exe est créé). Si aucun assemblage n'est nécessaire, il suffit de le mettre à blanc (c.-à-d. set assemblies=
).
-
Vous pourriez améliorer le script en vérifiant si une compilation est nécessaire (en comparant la date/heure du fichier *.cs et du fichier *.exe et en ne compilant que si le fichier *.cs est plus récent que le fichier *.exe). La façon dont cela peut être fait avec un lot est décrite aquí .
-
Une autre façon d'utiliser le compilateur C# est de le faire à partir de votre programme C#. Microsoft décrit cette approche aquí .
-
J'ai trouvé une bonne description de l'utilisation de fichiers de réponses avec CSC.exe . Et pour des scénarios plus complexes, vous aurez besoin de MSBUILD Cette description de la communauté des développeurs de Valve vous montre comment l'obtenir sans installer Visual Studio. Jetez-y un coup d'œil :-)