2017-02-15 21 views
3

最近、古いCodeDomProviderからMicrosoft.CodeDom.Providers.DotNetCompilerPlatformという新しいRoslyn CodeDomProviderにアップグレードしました。それはうまく動作しますが、間違った場所にcsc.exeがあります。私たちは、コンパイル時に、私たちはこのエラーを取得し、\ binに\デバッグ\ロスリンCodeDomProvider.CompileAssemblyFromSource - Roslyn(csc.exe)が見つからない

[アプリケーションパス]

:しかし はパスの一部が見つかりませんでした "NuGetパッケージは、パスにexeファイルを置きます[アプリケーションパス] \ bin \ Debug \ bin \ roslyn \ csc.exe 'に移動します。

間違った場所でexeファイルを探していることに注意してください。既にbin \ Debugフォルダにある "bin"フォルダの中にそれを探しています。したがって、コードをコンパイルするには、Roslynコンパイラを次の場所に移動する必要があります。 [アプリケーションパス] \ bin \ Debug \ bin \ roslyn \ csc.exe

CodeDomProviderにRoslynコンパイラはありますか?これはRoslynコンパイラコードのまっすぐなバグではありませんか?

答えて

1

NuGetパッケージMicrosoft.CodeDom.Providers.DotNetCompilerPlatform.BinFixを見てみましょう。私はそれを使用していませんが、これは多くの人々が遭遇した問題であるため、10Kのダウンロードがあります。

// Little hack here, see http://stackoverflow.com/a/40311406/1676558. 
object compilerSettings = typeof(CSharpCodeProvider) 
    .GetField("_compilerSettings", BindingFlags.Instance | BindingFlags.NonPublic) 
    .GetValue(_compiler); 
FieldInfo compilerSettingsFullPathField = compilerSettings 
    .GetType() 
    .GetField("_compilerFullPath", BindingFlags.Instance | BindingFlags.NonPublic); 
string desiredCompilerSettingsFullPath = ((string)compilerSettingsFullPathField 
    .GetValue(compilerSettings)) 
    .Replace(@"bin\roslyn\", @"roslyn\"); 
compilerSettingsFullPathField.SetValue(compilerSettings, desiredCompilerSettingsFullPath); 
+0

はいああ。これはハッキーですが、問題を解決するかもしれないようです。 –

0

変更] ポスト:私はこの問題に走ったと私はそれを回避するためにリフレクションを使用して覚えて、ここで私は_compilerは私CSharpCodeProviderである私はそれを基づかれたスタックオーバーフローの答えは、を参照して書いた抜粋ですプロジェクト設定のビルドイベント "タブ「の」-buildイベントコマンドラインへ:

IF EXIST $(TargetDir)roslyn\csc.exe (MKDIR $(TargetDir)bin & MOVE /Y $(TargetDir)roslyn $(TargetDir)bin\roslyn) 
+0

私はこれを行うことができることを認識していますが、それはポイントの横にあります。すべてのバイナリを1つのフォルダに保存したい。 Roslynはなぜそれが1つの場所にある場合にのみ動作するようにコード化されていますか? –

関連する問題