C# .NET:加载资源时自定义程序集解析失败
我有一个项目,需要在运行时动态加载额外的程序集以进行反射。我需要自定义代码,因为框架不知道DLL的路径。这段代码适用于普通DLL,它们加载良好,我可以对它们进行反思。但是,当我尝试加载静态使用嵌入式资源(即resx)的类型时,此代码失败 如果没有自定义的程序集解析代码,这可以正常工作。以下是我的汇编解析代码:C# .NET:加载资源时自定义程序集解析失败,c#,reflection,resx,C#,Reflection,Resx,我有一个项目,需要在运行时动态加载额外的程序集以进行反射。我需要自定义代码,因为框架不知道DLL的路径。这段代码适用于普通DLL,它们加载良好,我可以对它们进行反思。但是,当我尝试加载静态使用嵌入式资源(即resx)的类型时,此代码失败 如果没有自定义的程序集解析代码,这可以正常工作。以下是我的汇编解析代码: static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { bool
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
bool isName;
string path = GetAssemblyLoadInfo(args, out isName);
return isName ? Assembly.Load(path) : Assembly.LoadFrom(path);
}
static string GetAssemblyLoadInfo(ResolveEventArgs args, out bool isAssemblyName)
{
isAssemblyName = false;
var assemblyName = new AssemblyName(args.Name);
string path = String.Concat(new FileInfo(DllPath).Directory, "\\", assemblyName.Name, ".dll");
if (File.Exists(path))
{
return path;
}
if (path.EndsWith(".resources.dll"))
{
path = path.Replace(".resources.dll", ".dll");
if (File.Exists(path)) return path;
}
var assemblyLocation = AssemblyLocations.FirstOrDefault(al => al.Name.FullName == assemblyName.FullName);
if (null == assemblyLocation)
{
isAssemblyName = true;
return args.Name;
}
else
{
return assemblyLocation.Location;
}
}
以下是指向重新创建整个问题的项目的链接:
下载项目后,首先需要构建TestLibrary,然后运行ConsoleApp4。它应该可以正常工作,并将字符串“This is value of the resource”写入控制台,该字符串来自resx文件。但是,取消Program.cs中第23行的注释并再次运行它,它将失败并出现异常,这表明它未能加载嵌入式资源。此问题的解决方案解决了我的问题: 基本上,向正在加载的程序集添加以下代码:
[assembly: NeutralResourcesLanguage("en-GB", UltimateResourceFallbackLocation.MainAssembly)]