C# .NET:加载资源时自定义程序集解析失败

C# .NET:加载资源时自定义程序集解析失败,c#,reflection,resx,C#,Reflection,Resx,我有一个项目,需要在运行时动态加载额外的程序集以进行反射。我需要自定义代码,因为框架不知道DLL的路径。这段代码适用于普通DLL,它们加载良好,我可以对它们进行反思。但是,当我尝试加载静态使用嵌入式资源(即resx)的类型时,此代码失败 如果没有自定义的程序集解析代码,这可以正常工作。以下是我的汇编解析代码: static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { bool

我有一个项目,需要在运行时动态加载额外的程序集以进行反射。我需要自定义代码,因为框架不知道DLL的路径。这段代码适用于普通DLL,它们加载良好,我可以对它们进行反思。但是,当我尝试加载静态使用嵌入式资源(即resx)的类型时,此代码失败

如果没有自定义的程序集解析代码,这可以正常工作。以下是我的汇编解析代码:

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)]