【发布时间】:2014-03-14 17:09:44
【问题描述】:
我有一个引用程序集,其中 CopyLocal = True,该文件存在于 bin 文件夹中,但当我从 Visual Studio 运行解决方案时,它没有被复制到临时 ASP.NET 文件中
错误信息是正常的:
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 提供程序,至少在我的环境中 - 程序集必须在 GAC 中。
融合日志揭示了其原因。虽然我的 Web 应用程序可以在 bin 文件夹中找到程序集 - Web 服务器(IIS Express)也需要加载它,而这部分失败了。由于网络服务器不知道我的 bin 文件夹,它唯一可能从中获取文件的地方是 GAC。 Fusion 显示 IIS Express 正在查看 Temp ASP .Net 文件夹,但我认为这可能是某种回退,在我的情况下,卷影副本确实是在复制程序集,但复制到不同的位置(临时 ASP IIS Express 不知道要查找的 .NET Files\root\4f27e88a\bfcf2f79\assembly\dl3\06324d99\85ff3c73_1943cf01)。
问题 2:一旦我在 GAC 中正确完成了程序集,(惊喜)错字。我在“类型”属性中的类名错误
解决方案的思考过程
第一:跟随Ivan Niktin的调试流程,第二Fusion Logs are your friend
它试图从 Temporary ASP.Net Files 加载它是有道理的,因为这是一个 MVC Web 应用程序。
没有意义的是,正在搜索的 Temporary ASP.Net Files 位置是空的。如果我将程序集添加到 GAC,那么它可以正常加载,但这不是我的部署方案的选项。
融合日志显示为搜索的第一个路径:
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 中的配置,宿主项目和引用的程序集都使用 .网络框架 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 为假,那么它应该只在 bin 文件夹中查找。如果 shadowCopyBinAssemblies 为真,则卷影副本位置应包含我的应用程序的 dll 以及它引用的任何内容 - 它不应为空。
【问题讨论】:
-
该文件不需要被复制到那里,它应该只需要存在于您的 Web 应用程序的 bin 文件夹中。你确定这是它在日志中搜索的唯一路径吗?另外,我注意到错误消息引用了 MyNamespace.MyDll,而融合日志引用了 MyNamespace.Configuration.dll。你有没有被复制的传递依赖?
-
感谢 Craig W。我已将日志中的其他路径添加到答案并更正了命名,其中只涉及一个命名空间 MyNamespace.Configuration - 这是一个新的/几乎空的程序集,没有其他依赖项与 GAC 中的 System.Configuration 相比,宿主项目和引用的程序集都使用 .Net Framework 4.0
-
作为@CraigW。说,文件应该复制到那里。所以,我推荐一种不同的方法来解决这个错误。问题是您的程序集无法加载,但解决方案不是将程序集放在那里。检查其他属性(例如 Use Specific Version¿?)并确保您的构建可以无错误地编译。
-
这听起来很傻,但是转到引用程序集的属性并将 CopyLocal 从
true切换到false并再次返回。我似乎记得 Visual Studio 的一个版本中的一个问题,其中该属性将在属性网格中显示为true,但如果您查看 .csproj,它没有设置。 -
哈 :-) 一点也不傻 Craig W,我已经阅读了 VS 的已知问题并在本地复制 - 唉!我已经这样做了。
标签: c# asp.net .net asp.net-mvc