这是一个使用 VS2015的 WebApi 项目。
复制步骤:
另外一个小问题是,只要我将构建保留在“ bin”中,就可以使用另一个到任何地方的输出路径。
根据您的复制步骤,我假设更改应用程序属性中的输出路径是创建应用程序后的唯一更改。此更改的唯一作用是告诉 VisualStudio 将 MSBuild 的输出程序集放入新文件夹。然而,在运行时,ASP.Net 并不知道应该从这个新文件夹而不是 bin 文件夹加载程序集。
此 回答显示了更改 WebApi 应用程序的构建输出目录的方法。为了得到在那篇文章中显示的完全相同的错误,您需要注释掉 web.config 中的整个 < system. codedom > 部分。然后你可以按照说明改变输出路径。
在完成应用程序的工作之后,您可以取消注释 < system. codedom > 部分。如果你不在你的应用程序中使用 C # 6的新语法,你可以卸载 Microsoft。密码。供应商。从应用程序中添加 DotNetCompilerPlatform; 否则,您可能希望在生成后事件中添加以下命令行,
xcopy /Q /Y "$(TargetDir)roslyn\*.*" "$(TargetDir)..\roslyn\"
新的 CodeDom 提供程序总是在 bin 中查找“ roslyn”文件夹。上面的命令可以作为解决方案,并将 roslyn 文件夹从新的输出文件夹复制到 bin。
但是,在我的实验中,VisualStudio 的发布工具将输出程序集发布到部署位置的 bin 文件夹,而不管我的输出路径设置如何。我想您的应用程序应该仍然可以在实际部署中工作。
小心遵循这个答案的建议。虽然它解决了手头的问题,但在以后可能会导致不同的问题。
我也有同样的问题。显然。NET 编译器未加载到 GAC。我解决这个问题的方法是:
GAC
首先,在包管理器控制台类型中:
PM> Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
现在,出于某种原因,微软的好先生们决定不为我们把它安装到 GAC 上。您可以通过打开 Developer Command Prompt 并键入:
gacutil -i "C:\*PATH TO YOUR APP CODE*\bin\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll"
微软试图鼓励每个人都使用 nuget 来做任何事情,这样可以避免你在 nuget 系统中偶尔遇到的 bug。尝试在不同的解决方案上使用相同的项目,偶然(或者没有)更新它在其中一个解决方案上使用的许多小技巧中的一个,如果你运气不好,当你尝试构建另一个解决方案时,你就会明白我的意思。另一方面,将文件放入 GAC 也可能导致将来的问题,因为人们往往忘记他们放在那里的是什么,然后在设置新环境时他们忘记包含这些文件。另一个可能的解决方案是将文件放在第三方 dll 的中央文件夹中(尽管调用编译器第三方很奇怪) ,这会在设置新环境时造成引用中断的问题。如果您决定将 dll 安装到 GAC,请谨慎使用,并记住您已经这样做了。如果你不这样做,再次下载每个项目的插件,并承担由它引起的所有恼人的 bug (至少在我最终厌倦它并将文件放入 GAC 时会发生)。这两种方法都可能给您带来麻烦并产生问题,问题只在于您更愿意处理哪些问题。微软建议使用 nuget 系统,而且一般来说,听他们的比听一个不知名的程序员的更好,除非你完全厌倦了 nuget 系统,并且习惯了与 GAC 打交道足够长的时间,使它成为一个更好的选择。
我有同样的问题,我的应用程序在 Vs2013工作,但得到错误后更新到 Vs2015。
只需将下一个 nuget 包添加到您的项目 -Microsoft.CodeDom.Providers.DotNetCompilerPlatform。
Microsoft.CodeDom.Providers.DotNetCompilerPlatform
也有同样的问题。
NET 不像其他类型的应用程序那样搜索程序集的 bin/debug或 bin 下的任何子文件夹。您可以指示运行库使用以下配置查看不同的位置:
bin/debug
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="bin;bin\Debug;bin\Release"/> </assemblyBinding> </runtime> </configuration>
我在解决方案中有许多项目,而且 Web 项目(出现此错误的问题)没有设置为 StartUp 项目。我将这个 web 项目设置为 StartUp 项目,然后点击菜单项“ Debug”-> “ Start Debug”,它工作了。我停止了调试,然后再次尝试,现在它又能工作了。真奇怪。
我也有同样的问题,因为我移动了项目的位置,只需要重新创建虚拟目录。
如果您的项目有 罗斯林的参考资料和您部署在 IIS 服务器上,您可能会在网站上得到不必要的错误,因为许多托管提供商仍然没有升级他们的服务器,因此不支持罗斯林。
为了解决这个问题,您需要从项目模板中删除罗斯林编译器。删除 Roslyn 不会影响代码的功能。它对我和其他一些我参与的项目(C # 4.5.2)都很有效。
执行下列步骤:
PM> Uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform PM> Uninstall-package Microsoft.Net.Compilers
Remove the following code from your Web.Config file and restart IIS. (Use this method only if step 1 doesn't solve your problem.)
<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>
您应该更新项目中的“ Microsoft.CodeDom.Provider.DotNetCompilerPlatform”和“ Microsoft.Net.Compilers”包。
Uninstall-package Microsoft.Net.Compilers
在我的例子中,当我在4.5.2中使用 Web 应用程序和在4.6.1中使用引用的类库时,我得到了这个错误。当我将 Web 应用程序更新到4.5.2版本时,错误消失了。
在我的例子中,当我更改应用程序文件夹的权限并且帐户 IIS _ IUSRS 已被删除时,就会发生这种情况。在我将 IIS _ IUSRS (IIS Manager-> YourWebApp-> Edit Permission-> Add IIS _ IUSRS)重新添加到应用程序文件夹及其工作之后。
我知道这是一个老线程,但我想指出 DotNetCompilerPlatform.dll,f. ex 的可能版本问题。更新后。请检查新生成的 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>
在我更新了这两行之后,错误消失了。
我得到这个错误是因为我的应用程序池用户被设置为 ApplicationPoolIdentity。我将它更改为一个可以访问该文件夹的用户/服务帐户,错误消失了。
这是我的发现。今天早上我也遇到了这个问题。我只是将当前用户添加到运行应用程序的应用程序池中。
步骤:
打开 IIS
点击应用程序池
选择出现问题的应用程序池
右击-> 高级设置
点击 < strong > 标识 旁边的三点图标
现在选择自定义帐户
给你的电脑用户名和密码
保存
刷新您的应用程序... 它将开始工作。访问 dll 有一些安全问题。
确保在您的机器上的 Windows 特性中启用了 Internet 信息服务(IIS)
您可以安装、更新或卸载并安装此编译器
另一种可能的解决办法是:
Something 使用 管理人权利重新启动 VisualStudio 实例
只需从下面的命令中从包管理器控制台卸载包
PM > 卸载软件包 Microsoft. CodeDom. Provider. DotNetCompilerPlatform
PM > 卸载软件包 Microsoft.Net. Compilers
如果您最近安装或更新了 Microsoft.CodeDom.Providers.DotNetCompilerPlatform软件包,请仔细检查项目中引用的该软件包版本是否指向该软件包的正确版本:
在 ProjectName.csproj中,确保存在 Microsoft.CodeDom.Providers.DotNetCompilerPlatform的 <Import>标记并指向正确的版本。
ProjectName.csproj
<Import>
在 ProjectName.csproj中,确保在 Include属性和子 <HintPath>中存在 Microsoft.CodeDom.Providers.DotNetCompilerPlatform的 <Reference>标记,并指向正确的版本。
Include
<HintPath>
<Reference>
在该项目的 web.config中,确保存在 <system.codedom>标记,并且其子 <compiler>标记在其 type属性中具有相同的版本。
web.config
<system.codedom>
<compiler>
type
出于某种原因,在我的例子中,这个包从1.0.5升级到1.0.8,导致 .csproj中的 <Reference>标记使其 Include指向旧版本1.0。5.0(升级包之后我已经删除了它) ,但是其他的一切都指向新的正确的版本1.0。8.0.
.csproj
我是这样做的:
bin
Build Solution
我们遇到的异常不是在本地服务器上,而是在远程服务器上,Azure CI 正在从包文件夹读取它,但是没有找到上面提到的编译器版本。
它没有直接引用任何环境变量的包。
这解决了这个问题,但是在我们的案例中,我们不直接使用来自“ package.config”的包,而是使用一个单独的文件夹来维护团队之间的版本完整性。
点击“输出”选项卡,确保你没有这样的东西:
= = = = = = = = = = 重建所有: 14成功,1失败,0跳过 = = = = = = = = = = = = = =
打开你的 bin文件夹,检查它是否是最新的。
我一开始忽略了一大堆打印错误,忘记了它们正在破坏构建并导致没有复制 DLL。
检查文件中的 BIN文件夹是完全上传还是丢失。
BIN
向 CppCodeProvider 程序集添加引用。
关于这个错误,我尝试过:
uninstall-package Microsoft.CodeDom.Providers.DotNetCompilerPlatform
虽然这些似乎都是有效的解决方案,我只能生成新的错误和最终,错误似乎能够显示时,某些引用/核心缺失。
在我的例子中,我最近重新安装了 MicrosoftOffice,并引用了像 Microsoft 这样的程序集。办公室。核心。新的安装似乎没有包含所需的软件包,这使得我的解决方案无法正确构建。
我能够通过重新编写代码来解决这个问题,这样我就不需要参考 Microsoft 了。但是可以通过查找所需的软件包并相应地安装它们来解决这个问题。
看起来像是来自 Visual Studio 的一个不清楚的错误消息。
在我的情况下,我的网络项目没有加载正确(它显示项目不可用) ,然后我不得不重新加载我的网络项目后,打开我的视觉工作室在管理模式,然后一切工作正常。
如果您正在使用 git,那么您可能忽略了提交中的. dll
如果您正在从事一个项目,并且刚刚出现了这个错误。重新启动您的计算机(或服务器在我的情况下) ,这为我修复了问题。
在我们的示例中,我们使用 ToroiseSVN,默认情况下似乎没有将 bin 文件夹添加到源代码控制中。因此,当更新生产服务器上的网站时,bin 文件夹没有添加到其中,从而导致此异常。
要将 bin 文件夹添加到 SVN,请转到 hdd 上的文件夹并找到 bin 文件夹。右键单击它并选择 TortoiseSVN —— > Add
现在更新存储库以包含新添加的文件,然后更新生产服务器。一切都会好起来的。