最新の.NET Frameworkのcsc.exeのパスを取得する方法はありますか?
通常、ファイルはc:\ Windows\Microsoft.NET\Framework\vX.X.XXXにありますが、問題は複数のバージョンがインストールされている可能性があることと、32ビットバージョンと64ビットバージョンの両方があることです。
これに対する解決策はありますか?
c:\ Windows\Microsoft.NET\Framework\vX.X.XXXにはcsc.exeの最新の32ビットバージョンが含まれている必要があります
c:\ Windows\Microsoft.NET\Framework64\vX.X.XXXにはcsc.exeの最新の64ビットバージョンが含まれている必要があります
とにかくそれは私のものです。
ところで、プログラムファイルのVisual StudioツールフォルダーからVisual Studioコマンドラインを使用して、両方にアクセスできます。 cscコンパイラを使用して32ビットおよび64ビットアプリをビルドするために必要なすべてのパスを自動設定します。
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
更新しました:
コマンドプロンプトまたはPowershellを開き、以下のコマンドを実行して、インストールされているさまざまな.Net Frameworkバージョンのコンパイラの完全なパスを一覧表示します。
dir %WINDIR%\Microsoft.NET\Framework64\csc.exe /s/b
CSCパスは次のとおりです。
C:\ Program Files\MSBuild \\ Bin
例:Visual Studio 2013を使用している場合、12.0になります。
既にVisual Studioをインストールしている場合:[スタート]をクリックし、[すべてのプログラム]、[Microsoft Visual Studio]、[Visual Studioツール]の順にポイントし、[Visual Studioコマンドプロンプト]をクリックすると、次のようにコマンドラインボックスがコンパイルされます:
csc PathToYourCsSource
マイクロソフトは最近これをよく文書化しました- こちら を確認してください
Csc.exe実行可能ファイルは通常、Windowsディレクトリの下のMicrosoft.NET\Framework \フォルダーにあります。その場所は、特定のコンピューターの正確な構成によって異なる場合があります。コンピューターに複数のバージョンの.NET Frameworkがインストールされている場合、このファイルの複数のバージョンが見つかります。
ファイルをコンパイルするためにcsc.exe
を使用することを想定しているため、パスを求めていました。この目的でレジストリを調べるのではなく、作成した次の小さなバッチスクリプトを使用して、利用可能なlatest 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#アプリケーションを自動的に実行する場合は、%outPath%%outFileName%.exe
バッチスクリプトの最後まで。
このスクリプトは、.NET 2.0.x、3.5、および4.0.30319のシステムディレクトリの存在を確認します-csc.exeを見たことがない他のフォルダに。最も古いバージョンから最新バージョンへのチェックを行うため、変数dotNet
には最新の既存のパスが含まれます。
注意してください
Microsoftは、最新バージョン4.7.1を含むすべての4.xバージョンの.NETを4.0.30319フォルダーに保存します。そのため、.NET 4.xのいずれかのバージョンがインストールされている場合、そこにあります。
32ビットバージョンではなく64ビットバージョンが必要な場合は、Framework
をFramework64
に置き換えるだけです。環境変数dotNetBase
(スクリプトの2行目)。
csc.exe
はまだ存在しますが、C#バージョン5に制限されています(csc.exeを呼び出すたびにこの警告が表示されます)。しかし、多くの便利なコンソールアプリケーションでは、C#5で十分です。上位バージョン(C#6または7)が必要な場合は、Visual Studioが必要です。または Roslyn GitHubエリア にアクセスしてRoslynコンパイラーのソースコードを取得できます。
ネクロマンシング。
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