远程加载程序集时查找全球化资源文件

Nev*_*vyn 6 c# globalization assemblies

我们的代码使用"插件"模型,远程加载符合IPluginModel主程序中定义的预定义结构的dll .主程序本身有几种本地化形式,其中UI中标签的文本和位置都根据不同的本地化而改变Thread.CurrentThread.CurrentUICulture.

我们注意到的一件事是来自远程加载的dll的任何表单或报告永远不会被正确本地化.包含插件的不同资源的本地化dll的位置似乎并不重要,无论是在主窗体旁边,插件dll旁边还是其他任何位置.在主程序的RunTime期间加载程序集本身时,如何使程序集正确定位其本地化资源?

我确实有类似于此处使用的方法的代码,但是如果可能的话,不希望必须针对表单本身手动实现resx.我所拥有的代码直接位于插件本身内,只要CurrentUICulture不是"en-US"就会被调用.

理想情况下,我正在寻找的是一种加载pluginName.resources.dll与我刚刚加载的插件直接相关的方法.我确实看到我的主项目bin文件夹中的不同文件夹,es文件夹包含一个main.resources.dll,但只是将插件dll放在该文件夹中,上次我尝试它时似乎没有用,虽然理论上可能已经改变了......或者我当时可能做错了......

加载程序集[code snippet]

    private void LoadPlugin(string filePath)
    {
        bool isValidPlugin = false;
        Assembly asm = null;
        try
        {
            asm = Assembly.LoadFrom(Path.Combine(Environment.CurrentDirectory, filePath));
                //Do some type checking to make certain this is in fact one of OUR plugins
            var p = (IFTLPlugin)Activator.CreateInstance(types[x]);
                _plugins.Add(p.Prefix, p);
            }
        }
Run Code Online (Sandbox Code Playgroud)

编辑:关于这个主题的更多想法

有没有办法拦截试图解析附属程序集的加载结构,我可以实现的事件或我可以覆盖的函数,我可以手动将代码指向正确的资源程序集?我发现了一些关于装配分辨率的东西,但这是用于直接加载,而不是用于卫星资源.

Jes*_*olm 0

正如您在问题背景中指出的那样,.NET 系统在加载资源程序集时使用 Thread.CurrentThread.CurrentUICulture

问题是每个新线程都默认为CultureInfo.InstalledCulture,除非另有说明。

让您的主代码在初始化调用中将所需的区域性传递给库。

然后在加载任何资源之前让库设置其Thread.CurrentThread.CurrentUICulture(以及.CurrentCulture,如果适用)。例如,这将是在调用InitializeComponent()TryFindResource()之前。

这使得库的线程文化与主程序的线程文化保持一致,无论操作系统对此有何想法。