我有一个Referenced程序集,其中CopyLocal = True,该文件存在于bin文件夹中,但是当我从Visual Studio运行解决方案时它没有被复制到Temporary ASP.NET Files
错误消息通常是:
An error occurred loading a configuration file: Could not load file or assembly 'MyNamespace.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.
解决方案/实际原因
有很多问题:
问题1:为了加载configProtectedData Provider,至少在我的环境中 - 程序集必须在GAC中。
融合日志揭示了这一点的原因。虽然我的Web应用程序可以在bin文件夹中找到程序集 - Web服务器(IIS Express)也需要加载它,但这部分失败了。由于Web服务器不知道我的bin文件夹,因此唯一可以从中获取文件的地方是GAC。 Fusion显示,IIS Express在查看Temp ASP .Net文件夹时已经开始了,但我认为这可能是某种后备,在我的情况下,影子副本确实是在复制程序集但是在不同的位置(临时ASP) .NET文件\ root \ 4f27e88a \ bfcf2f79 \ assembly \ dl3 \ 06324d99 \ 85ff3c73_1943cf01)IIS Express不知道要查找。
问题2:一旦我在GAC中正确组装,(惊喜)错字。我在“type”属性中输入了类名错误
了解解决方案的思考过程
首先:关注Ivan Niktin的调试过程,第二个Fusion Logs are your friend
有意义的是它试图从临时ASP.Net文件加载它,因为这是一个MVC Web应用程序。
没有意义的是,正在搜索的临时ASP.Net文件位置为空。如果我将程序集添加到GAC然后加载正常,但这不是我的部署方案的选项。
Fusion Log显示为搜索的第一条路径:
LOG: Attempting download of new URL file:
///C:/Users/Rob/AppData/Local/Temp/Temporary ASP.NET Files/root
/4f27e88a/bfcf2f79/MyNamespace.Configuration.DLL
其他路径是:
.../MyNamespace.Configuration.DLL
.../MyNamespace.Configuration/MyNamespace.Configuration.DLL
.../MyNamespace.Configuration.EXE
.../MyNamespace.Configuration/MyNamespace.Configuration.EXE
当我查看正在搜索DLL的文件夹的内容时 - 它是空的!
只有一个名称空间涉及MyNamespace.Configuration - 这是一个新的/几乎为空的程序集,除 System 之外没有依赖项.GAC中的配置,主机项目和引用的程序集都在使用。 Net Framework 4.0
尝试加载受影响的程序集的应用程序部分是:
<configProtectedData defaultProvider="DynamicFileConfigurationProvider">
<providers>
<add name="DynamicFileConfigurationProvider"
type="MyNamespace.Configuration.DynamicFileConfigurationProvider,
MyNamespace.Configuration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=aeecd94c462a579a"
SelectorKeyProviderName="HostNameSelectorKeyProvider"/>
</providers>
</configProtectedData>
更新
将shadowCopyBinAssemblies设置为false会导致绑定器查看../Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files / ...而不是之前的IIS Express位置
之前拦截异常并未提供任何其他信息,只是提供了无法找到该文件的相同消息。
引用另一个主机中的程序集,控制台和Web都没有信息,程序集加载正常,可以调用方法。
手动将组件放置在活页夹所在的位置也可以工作 - 在我看来,组装活页夹看起来在错误的位置。即如果shadowCopyBinAssemblies为false,那么它应该只查看bin文件夹。如果shadowCopyBinAssemblies为true,那么卷影副本位置应该包含我的应用程序的dll以及它引用的任何dll - 它不应该为空。
答案 0 :(得分:1)
基本上,Temporary ASP.NET Files文件夹包含程序集副本,以允许bin文件夹中的文件更新。当运行时加载程序集时,它将被锁定,因此您无法更新服务器上的程序集。要解决此问题,运行时会将它们复制到“Temporary ASP.NET Files”文件夹中。
我会尝试解决以下问题:
尝试禁用节目复制(<hostingEnvironment shadowCopyBinAssemblies="false" />
或http://msdn.microsoft.com/en-us/library/system.appdomainsetup.shadowcopyfiles.aspx)以检查问题是否与临时ASP.NET文件有关。
尝试使用VS中的“Break on exception”功能或使用异常处理程序获取有关异常的更多详细信息。检查exception.Data和.FusionLog属性以获取有关异常的更多详细信息。
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler((x, y) =>
{
var exception = y.ExceptionObject as System.IO.FileNotFoundException;
if (exception != null)
// Retrieve exception information here
});
尝试在单独的项目中加载有问题的程序集。即使是一个简单的控制台应用也没关系。
这些活动可以帮助您缩小问题的原因。
答案 1 :(得分:0)
不确定MVC应用程序中的原因,但我在基于Web表单的Web应用程序中遇到了类似的问题,其中Referenced Assembly我们设置为CopyLocal = True。我的Web项目引用了GAC和位于解决方案内相对路径中的文件夹的程序集。
我通过
解决了这个问题事情开始奏效了。您也应该尝试这些步骤,这可能有助于解决问题。