AppDomain AssemblyResolve事件请求Microsoft.Practices.EnterpriseLibrary.Common.resources

时间:2011-03-15 04:45:05

标签: c# enterprise-library

我编写了一个自定义AssemblyResolve方法来处理除exe文件以外的文件夹中的程序集。但一旦它显示缺少“Microsoft.Practices.EnterpriseLibrary.Common.resources”。虽然我有Microsoft.Practices.EnterpriseLibrary.Common.dll,但我没有Microsoft.Practices.EnterpriseLibrary.Common.resources.dll。如何手动加载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;  
        }

2 个答案:

答案 0 :(得分:3)

已在Microsoft Connect上讨论了问题。

建议的解决方案: 将以下行添加到AssemblyInfo.cs:

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

答案 1 :(得分:2)

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

  

重要从.NET Framework 4开始,为所有程序集引发ResolveEventHandler事件,包括   资源集合。在早期版本中,未引发该事件   资源集合。如果操作系统已本地化,则为处理程序   可能被多次调用:对于后备中的每种文化都会被调用一次   链

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