我们有一个Web应用程序,该应用程序大量使用动态代码编译。 我的任务是添加C#6功能并利用roslyn编译器。
这样做非常简单。只需添加nuget包
所有使用动态代码编译并更改一行代码的项目
private static System.CodeDom.Compiler.CodeDomProvider Compiler => compiler
?? (compiler =
new
Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider());
到目前为止一切正常。将nuget包添加到使用动态代码编译的单元测试中之后,它们也可以工作(本地化)。
但是当我查询VSTS / TFS服务器上的新版本时,某些单元测试失败。经过一番研究,我发现了问题所在:
System.IO.DirectoryNotFoundException:找不到路径“ D:\ Agents \ agent_work \ 1 \ a \ roslyn \ csc.exe”的一部分。 在System.IO .__ Error.WinIOError(Int32 errorCode,可能是StringFullPath) 在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess访问,Int32权限,布尔useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,字符串msgPath,布尔bFromProxy,布尔useLongPath,布尔checkHost) 在System.IO.FileStream..ctor处(字符串路径,FileMode模式,FileAccess访问,FileShare共享) 在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.get_CompilerName() 在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromFileBatch(CompilerParameters选项,String []文件名) 在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.FromSourceBatch(CompilerParameters选项,String []源) 在Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Compiler.CompileAssemblyFromSourceBatch(CompilerParameters选项,String []源) 在System.CodeDom.Compiler.CodeDomProvider.CompileAssemblyFromSource(CompilerParameters选项,String []源)处 在[...]
好吧,项目根目录是查找roslyn二进制文件的错误位置。
在相关单元测试的app.config中:
<appSettings>
<add key="aspnet:RoslynCompilerLocation" value="roslyn" />
</appSettings>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
我也尝试过nuget包Microsoft.CodeDom.Providers.DotNetCompilerPlatform.BinFix
没有成功。我发现了很多信息,如何解决/ bin / roslyn错误,但是对于构建服务器,单元测试和roslyn的特殊组合一无所知。有人有更多信息吗?
编辑:
我尝试了Jayendran的建议解决方案。我发现变量$(CscToolPath)和$(WebProjectOutputDir)像这样是空的:
<Target Name="CheckVariables" AfterTargets="AfterBuild" Condition="'$(OutDir)' != '$(OutputPath)'">
<Message Text="$(OutDir)" Importance="high"/>
<Message Text="$(OutputPath)" Importance="high"/>
<Message Text="$(CscToolPath)" Importance="high"/>
<Message Text="$(WebProjectOutputDir)" Importance="high"/>
</Target>
$(CscToolPath)和$(WebProjectOutputDir)没有输出。
EDIT2: 解决方法是,编辑单元测试的app.configs如下:
<appSettings>
<add key="aspnet:RoslynCompilerLocation" value="_PublishedWebsites\*OneOfTheWebApps*\bin\roslyn" />
</appSettings>
单元测试现在可以找到二进制文件,而且似乎此更改对我的本地计算机没有影响。单元测试现在在本地和构建服务器上通过。但是,这不能解决这个问题。