CodeDomProvider.CompileAssemblyFromSource - 无法找到Roslyn(csc.exe)

时间:2017-02-15 22:02:19

标签: c# .net compilation roslyn codedom

我们最近从旧的CodeDomProvider升级到名为Microsoft.CodeDom.Providers.DotNetCompilerPlatform的新Roslyn CodeDomProvider。它工作正常,但它在错误的地方寻找csc.exe。 NuGet包将exe放在路径中:

[App Path] \ bin \ Debug \ roslyn

但是,当我们编译时,我们得到这个错误: 无法找到路径的一部分' [App Path] \ bin \ Debug \ bin \ roslyn \ csc.exe'。

请注意,它正在寻找错误位置的exe。它正在" bin"中寻找它。已经在bin \ Debug文件夹中的文件夹。因此,为了使我们的代码编译,我们需要将Roslyn编译器移动到: [App Path] \ bin \ Debug \ bin \ roslyn \ csc.exe

有没有办法告诉CodeDomProvider Roslyn编译器所在的位置?这不仅仅是Roslyn编译器代码中的一个直接错误吗?

2 个答案:

答案 0 :(得分:1)

我将看看NuGet包Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix。我没有使用它,但它有10K的下载量,因为这是很多人遇到的问题,我想。我遇到了这个问题,我记得使用反射来解决它,这里是我写的一个片段,其中引用了Stack Overflow的答案我基于它,其中_compiler是我的CSharpCodeProvider:

// 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);

答案 1 :(得分:0)

更改' 构建后事件命令行'在' 构建活动'项目设置选项卡:

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