我编写了一个自定义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;
}
答案 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。如果该文件存在,我们加载并返回该程序集。这解决了我们的问题。