MVCSiteMapProvider - System.Windows加载问题

时间:2014-02-04 15:15:01

标签: mvcsitemapprovider

我试图升级到最新版本的MVCSiteMapProvider并遇到问题。在某些上下文中,我无法使用Nuget,所以使用git克隆,在本地以发布模式构建,并将相关程序集复制到我的项目依赖项文件夹,添加对MvcSiteMapProvider.dll,Microsoft.Web.Infrastructure.dll和WebActivatorEx的引用.dll文件。

因为它是一个正在运行的应用程序,我不能像源文件文件那样建议,只需复制unity文件夹/文件。我虽然如下(粗略地)将容器连接起来:

public class UnityRegistrar
{
    public UnityRegistrar()
    {

      container = new UnityContainer();
      container.AddNewExtension<MvcSiteMapProviderContainerExtension>();
    }
}

扩展类基于https://github.com/maartenba/MvcSiteMapProvider/tree/master/src/MvcSiteMapProvider/CodeAsConfiguration/Unity/DI/Unity/ContainerExtensions

在Unity中注册了各种类型的地图,以下代码是最后要执行的内容。

MvcSiteMapProvider.SiteMaps.Loader = container.Resolve<ISiteMapLoader>();

最终结果是我得到以下类型加载异常: 无法加载文件或程序集System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e&#39;或其中一个依赖项。系统找不到指定的文件。

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.IO.FileNotFoundException:

无法加载文件或程序集“System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e&#39;或其中一个依赖项。系统找不到指定的文件。

所引用的三个dll中没有一个取决于这个程序集,所以我不确定我做错了什么。不用说,通过nuget添加引用的vanilla项目,而不通过Unity配置IoC。但是,从我的应用程序中删除MvcSiteMapProvider启动/ IoC代码并不是,所以不确定我在这里做错了什么。

有关它为什么要求System.Windows.dll的任何想法?

修改

有关错误的更多细节: [FileNotFoundException:无法加载文件或程序集&#39; System.Windows,Version = 2.0.5.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e&#39;或其中一个依赖项。该系统找不到指定的文件。]    System.ModuleHandle.ResolveType(RuntimeModule模块,Int32 typeToken,IntPtr * typeInstArgs,Int32 typeInstCount,IntPtr * methodInstArgs,Int32 methodInstCount,ObjectHandleOnStack类型)+0    System.ModuleHandle.ResolveTypeHandleInternal(RuntimeModule module,Int32 typeToken,RuntimeTypeHandle [] typeInstantiationContext,RuntimeTypeHandle [] methodInstantiationContext)+371    System.ModuleHandle.ResolveTypeHandle(Int32 typeToken,RuntimeTypeHandle [] typeInstantiationContext,RuntimeTypeHandle [] methodInstantiationContext)+19    System.Reflection.RuntimeModule.ResolveType(Int32 metadataToken,Type [] genericTypeArguments,Type [] genericMethodArguments)+319    System.Reflection.CustomAttribute.FilterCustomAttributeRecord(CustomAttributeRecord caRecord,MetadataImport scope,Assembly&amp; lastAptcaOkAssembly,RuntimeModule decoratedModule,MetadataToken decoratedToken,RuntimeType attributeFilterType,Boolean mustBeInheritable,Object [] attributes,IList derivedAttributes,RuntimeType&amp; attributeType,IRuntimeMethodInfo&amp; ctor,Boolean&amp; ctorHasParameters, Boolean&amp; isVarArg)+203    System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeModule decoratedModule,Int32 decoratedMetadataToken,Int32 pcaCount,RuntimeType attributeFilterType,Boolean mustBeInheritable,IList derivedAttributes,Boolean isDecoratedTargetSecurityTransparent)+1179    System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeAssembly assembly,RuntimeType caType)+146    WebActivatorEx.AssemblyExtensions.GetActivationAttributes(Assembly assembly)+113    WebActivatorEx.ActivationManager.RunActivationMethods(布尔设计师模式)+290    WebActivatorEx.ActivationManager.RunPreStartMethods(布尔设计师模式)+47    WebActivatorEx.ActivationManager.Run()+70

[InvalidOperationException:预应用程序启动初始化方法在类型WebActivatorEx.ActivationManager上运行时抛出异常,并显示以下错误消息:无法加载文件或程序集&System; Windows.Windows,Version = 2.0.5.0,Culture =中性,PublicKeyToken = 7cec85d7bea7798e&#39;或其中一个依赖项。该系统找不到指定的文件..]    System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection 1 methods, Func 1 setHostingEnvironmentCultures)+12600191    System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods)+12599912    System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath,Boolean&amp; isRefAssemblyLoaded)+280    System.Web.Compilation.BuildManager.ExecutePreAppStart()+ 172    System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager,IApplicationHost appHost,IConfigMapPathFactory configMapPathFactory,HostingEnvironmentParameters hostingParameters,PolicyLevel policyLevel,Exception appDomainCreationException)+1151

[HttpException(0x80004005):预应用程序启动初始化方法在WebActivatorEx.ActivationManager类型上运行时抛出异常,并显示以下错误消息:无法加载文件或程序集&System; Windows.Windows,Version = 2.0.5.0 ,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e&#39;或其中一个依赖项。该系统找不到指定的文件..]    System.Web.HttpRuntime.FirstRequestInit(HttpContext context)+12599232    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)+159    System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr,HttpContext context)+12438981

它与WebActivatorEx的使用有关。如果我删除了参考,并清理了bin目录,它就不会爆炸。我没有使用WebActivator和PostApplicationStartMethod来构建我的容器。我在global.asax中使用了一种方法来提升我的容器。

不确定为什么WebActivatorEx要求System.Windows,因为它不是依赖项。

3 个答案:

答案 0 :(得分:1)

我的System.Windows加载异常问题的根源是由于bin目录中的程序集不属于那里。在某些人的智慧中,他们包括一个后期构建任务,用于将所有依赖项复制到bin,包括那些未被项目引用的依赖项。因此,为什么在Web项目的bin目录中有System.Windows。* .dll。

答案 1 :(得分:0)

您是否有完整的堆栈跟踪异常发生的位置?你能尝试分析融合日志吗? http://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx

答案 2 :(得分:0)

  

本地内置于发布模式

基于@maartenba提供的link,我怀疑这就是你的问题所在,因为你需要正确设置编译器开关和框架版本,才能使所有依赖项正常工作。更不用说,他们需要完全匹配您在项目中的内容。

首先,确保您运行分支的构建。

如果您运行 build.bat 文件,将版本和软件包版本开关传递给它,您将能够以与为NuGet软件包构建它们相同的方式构建所有版本。然后,您可以确保为.NET框架版本正确设置了所有依赖项。

(From the same directory as the MvcSiteMapProvider.sln file)
(NOTE: Use the current version on NuGet Gallery, this version is only current at the time of this writing)

MvcSiteMapProvider>build.bat -pv:4.4.9 -v:4.4.9

请注意,这会触发PowerShell脚本,因此您可能需要运行this command才能正确设置PowerShell。有关详细信息,请参阅this article

运行构建后,您将能够在 \ release 文件夹中访问原始DLL文件和.nupkg文件(如果要通过NuGet在本地安装它们)。可以在

找到DLL
(From the same directory as the MvcSiteMapProvider.sln file)
\release\mvcsitemapprovider.mvc[X].core\lib\net[YY]\MvcSiteMapProvider.dll

将您的MVC版本替换为X,将YY替换为您的.NET框架版本(示例使用40表示4.0或45表示4.5)。

.nupkg文件位于 \ release 目录的根目录下,并使用NuGet库中使用的相同约定命名。

另一方面,如果您“无法使用NuGet”,因为您无法从开发或构建计算机访问Internet,请注意可以通过进入“设置”从本地目录访问.nupkg文件从主NuGet GUI窗口,然后添加“包源”映射到您自己的文件系统。如果您的意思是“不能使用NuGet”,因为您害怕破坏DI配置,请注意Unity“仅模块”软件包是为此目的而设计的 - 它们只为您提供了一个与现有DI配置集成的模块,同时保持主要接线代码完好无损。您只需在现有配置中添加几行以使车轮转动 - 请参阅readme file for Unity。当然,你可能有另一个不使用NuGet的原因,但只是想确定你(和社区)都知道这些要点。