2011-03-15 32 views
3

我写了一个自定义的AssemblyResolve方法来处理exe文件以外的文件夹中的程序集。但一旦显示缺少“Microsoft.Practices.EnterpriseLibrary.Common.resources”。虽然我有Microsoft.Practices.EnterpriseLibrary.Common.dll,我没有Microsoft.Practices.EnterpriseLibrary.Common.resources.dll。我如何手动加载Microsoft.Practices.EnterpriseLibrary.Common.resources?AppDomain AssemblyResolve事件要求Microsoft.Practices.EnterpriseLibrary.Common.resources

protected Assembly ConfigResolveEventHandler(object sender, ResolveEventArgs args) 
     { 
      //This handler is called only when the common language runtime tries to bind to the assembly and fails. 

      //Retrieve the list of referenced assemblies in an array of AssemblyName. 
      string strTempAssmbPath = ""; 
      Assembly asm = this.GetType().Assembly; 

      var uri = new Uri(Path.GetDirectoryName(asm.CodeBase)); 


      Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly(); 
      AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies(); 

      //Loop through the array of referenced assembly names. 
      if (arrReferencedAssmbNames.Any(strAssmbName => strAssmbName.Name == args.Name)) 
      { 
       strTempAssmbPath = Path.Combine(uri.LocalPath, args.Name) + ".dll"; 
      } 
      //Load the assembly from the specified path.      
      Assembly myAssembly = Assembly.LoadFrom(strTempAssmbPath); 

      //Return the loaded assembly. 
      return myAssembly; 
     } 
+0

我遇到了同样的问题,但我不相信它实际上是一个存在的DLL。 “Microsoft.Practices.EnterpriseLibrary.Common.dll”库中附带有资源,可能出于某种原因无法访问这些资源。在.NET Reflector中查看它,它列出了引用,并且未列出“Microsoft.Practices.EnterpriseLibrary.Common.resources.dll”。你有没有运气呢? – merthsoft 2011-04-27 22:00:05

回答

3

问题已在Microsoft Connect上讨论过。

建议解决办法: 以下行添加到AssemblyInfo.cs中:

[assembly: NeutralResourcesLanguageAttribute("en-US", UltimateResourceFallbackLocation.MainAssembly)] 
2

我们遇到了与AssemblyResolve事件处理同样的问题。奇怪的是,我们只在Windows XP机器上看到这个问题。我们的应用程序本地化为多种语言,因此我们对使用NeutralResourcesLanguageAttribute犹豫不决。我们的应用程序被编译为.NET v3.5版本,但仍然受着AssemblyResolve变化documented为.NET V4.0:

重要从.NET Framework 4开始,ResolveEventHandler事件引发适用于所有组件,包括 资源组件。在较早的版本中,不会为 资源组件提出该事件。如果操作系统已本地化,则可能会多次调用处理程序 :对于后备 链中的每个区域,都会执行一次。

我们解决这个问题的方法是检查e.Name并查看它是否正在查找* .Resources.dll。如果该文件未在AppDomain或已知文件夹中找到,我们将删除“.Resources”并查找* .dll。如果该文件存在,我们加载并返回该程序集。这解决了我们的问题。

相关问题