这是一个使用VS2015的WebApi项目。
复制步骤:
- 创建一个空的WebApi项目
- 将构建输出路径从“ bin \”更改为“ bin \ Debug \”
- 跑
在将“生成输出”路径从“ bin \”更改为“ bin \ Debug \”之前,一切工作正常,实际上,除“ bin \”以外的任何输出路径均无效。
另外一点是,只要我将构建保留在“ bin \”中,就可以在任何地方都具有另一个输出路径。
请帮助提供解决方案以解决此问题。我想这会在实际部署上带来问题。
这是一个使用VS2015的WebApi项目。
复制步骤:
在将“生成输出”路径从“ bin \”更改为“ bin \ Debug \”之前,一切工作正常,实际上,除“ bin \”以外的任何输出路径均无效。
另外一点是,只要我将构建保留在“ bin \”中,就可以在任何地方都具有另一个输出路径。
请帮助提供解决方案以解决此问题。我想这会在实际部署上带来问题。
Answers:
如果您的项目具有Roslyn引用,并且正在将其部署在IIS服务器上,则由于许多托管服务提供商仍未升级其服务器,因此不支持Roslyn,因此您可能会在网站上收到不必要的错误。
要解决此问题,您需要从项目模板中删除Roslyn编译器。删除Roslyn不应影响代码的功能。对于我和其他我从事过的项目(C#4.5.2)来说,它工作正常。
请执行以下步骤:
使用下面显示的命令行从以下Nuget软件包中删除(或者您可以通过右键单击Root Project Solution并删除它们来使用Nuget软件包管理器的GUI)。
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM> Uninstall-package Microsoft.Net.Compilers
从Web.Config文件中删除以下代码,然后重新启动IIS。(仅当步骤1无法解决您的问题时,才使用此方法。)
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
'Enabling the .NET Compiler Platform.
请注意遵循此答案的建议。它可以解决当前的问题,但以后可能会引起其他问题。
我遇到了同样的问题。显然.NET编译器没有加载到GAC
。我要做的是解决:
首先,在包管理器控制台中输入:
PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
现在,由于某种原因,Microsoft的好先生们决定不为我们将其安装到GAC。您可以通过打开“开发人员命令提示符”并键入以下内容来手动完成此操作:
gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"
Microsoft尝试鼓励每个人都使用nuget进行所有操作,这可能会很好,而不会遇到nuget系统偶尔遇到的错误。尝试在不同的解决方案上使用同一项目,不小心(或不)更新它在其中一个上使用的许多nuget中的一个,如果不幸的话,当您尝试构建另一个解决方案时,您会明白我的意思。另一方面,将文件放入GAC也会引起将来的问题,因为人们往往会忘记放置在GAC中的内容,然后在设置新环境时会忘记包括这些文件。另一种可能的解决方案是将文件放在第3方dll的中央文件夹中(尽管调用编译器3rd有点奇怪),这在设置新环境时会产生引用中断的问题。如果您决定将dll安装到GAC,谨慎使用,并记住您是这样做的。如果您不这样做,请再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。再次为每个项目下载nuget,并承担由它引起的所有烦人的bug(至少在我最后厌倦了它并将其放在GAC中后,这种情况经常发生)。两种方法都可能使您头疼并产生问题,这只是您要处理哪些问题的问题。微软建议使用nuget系统,通常,最好听一听它们,而不是SO中一个未知的程序员,除非您完全厌倦了nuget系统,并且使用GAC的时间足够长,以使其成为更好的选择为了你。
我知道这是一个旧线程,但我想指出DotNetCompilerPlatform.dll f的可能版本问题。例如 更新后。请检查新生成的Web.config文件是否与您发布的web.config不同,尤其是system.codedom部分。就我而言,版本是从1.0.7更改为1.0.8。新的dll已经被复制到服务器上,但是我没有更改旧的web.config(带有一些服务器特殊设置):
<pre>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.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=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
</pre>
更新两行后,错误消失了。
2.0.0
至2.0.1
根据您的复制步骤,我假设更改应用程序属性中的输出路径是您创建应用程序后的唯一更改。所做的唯一更改是,它告诉Visual Studio将MSBuild的输出程序集放入新文件夹中。但是,在运行时,ASP.Net不会从该新文件夹而不是\ bin文件夹中加载程序集。
此答案显示了更改WebApi应用程序的生成输出目录的方法。为了获得与该帖子中显示的完全相同的错误,您需要注释掉web.config中的整个<system.codedom>部分。然后,您可以按照说明更改输出路径。
完成申请工作后,可以取消对<system.codedom>部分的注释。如果您根本不在应用程序中使用C#6新语法,则可以从应用程序中卸载Microsoft.CodeDom.Providers.DotNetCompilerPlatform。否则,您可能需要在构建后事件中添加以下命令行,
xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"
新的CodeDom提供程序始终在\ bin中寻找“ \ roslyn”文件夹。上面的命令是一种解决方法,并将\ roslyn文件夹从新的输出文件夹复制到\ bin。
但是,在我的实验中,无论我的输出路径设置如何,Visual Studio的发布工具都会将输出程序集发布到部署位置的\ bin文件夹中。我猜您的应用程序仍然可以在实际部署中正常工作。
就我而言,这是在我更改应用程序文件夹的权限时发生的,并且帐户IIS_IUSRS已被删除。在我将IIS_IUSRS(IIS管理器-> YourWebApp->编辑权限->添加IIS_IUSRS)重新添加到应用程序文件夹后,它起作用了。
ASP.NET不会bin/debug
像其他类型的应用程序一样搜索程序集或bin下的任何子文件夹来寻找程序集。您可以使用以下配置指示运行时在其他位置查看:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin\Debug;bin\Release"/>
</assemblyBinding>
</runtime>
</configuration>
就我而言,当我在4.5.2中拥有Web应用程序并且在4.6.1中拥有引用的类库时,出现了错误。当我将Web应用程序更新为4.5.2版本时,错误消失了。
只需从下面的命令从软件包管理器控制台中卸载软件包
PM>卸载软件包Microsoft.CodeDom.Providers.DotNetCompilerPlatform
PM>卸载Microsoft.Net.Compilers软件包
如果您最近安装或更新了该Microsoft.CodeDom.Providers.DotNetCompilerPlatform
软件包,请仔细检查项目中引用的该软件包的版本是否指向该软件包的正确且相同的版本:
在中ProjectName.csproj
,确保存在的<Import>
标记,Microsoft.CodeDom.Providers.DotNetCompilerPlatform
并指向正确的版本。
在中ProjectName.csproj
,确保在属性和child中都存在的<Reference>
标记Microsoft.CodeDom.Providers.DotNetCompilerPlatform
,并指向正确的版本。Include
<HintPath>
在该项目的中web.config
,确保<system.codedom>
存在标签,并且其子<compiler>
标签的type
属性具有相同的版本。
出于某种原因,在我的情况下,从1.0.5至1.0.8,这个包的升级导致了<Reference>
在标签.csproj
有其Include
指向旧版本1.0。5 .0(升级软件包后删除了该文件),但其他所有内容均指向新的正确版本1.0。8 .0。
在我的情况下,我的Web项目未正确加载(显示项目不可用),然后在以管理模式打开Visual Studio之后必须重新加载Web项目,然后一切正常。
我们遇到的一个例外不在本地,而是在远程服务器上,Azure CI正在从程序包文件夹中读取它,但未找到上述编译器版本。
为了解决这个问题,我们修改了项目文件,使其类似于
它没有在这里直接引用环境变量的任何包。
这解决了问题,但是在我们的情况下,我们不直接使用“ package.config”中的软件包,而是拥有一个单独的文件夹来维护团队之间的版本完整性。
从启动命令转到inetmgr在IIS管理器控制台中,选择“默认网站”下的应用程序文件夹,右键单击该文件夹,然后转换为应用程序。
关于此错误,我尝试了:
uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
uninstall-package Microsoft.Net.Compilers
并重新安装。虽然所有这些似乎都是有效的解决方案,但我只能生成新的错误,最后,当缺少某些引用/小数字时,该错误似乎能够显示。
就我而言,我最近重新安装了Microsoft Office,并引用了Microsoft.Office.Core之类的程序集。新安装的似乎没有包括所需的软件包,因此无法正确构建我的解决方案。
我可以通过重新编写代码到不需要引用Microsoft.Office的方式来解决此问题,但是可以通过查找所需的程序包并进行相应的安装来解决此问题。
好像是来自Visual Studio的不清楚的错误消息。