Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在远程加载程序集时查找全球化的资源文件_C#_Assemblies_Globalization - Fatal编程技术网

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

C# 在远程加载程序集时查找全球化的资源文件,c#,assemblies,globalization,C#,Assemblies,Globalization,我们的代码使用“插件”模型,远程加载符合主程序中定义的预定义结构IPluginModel的dll。主程序本身有几种本地化形式,其中UI中的文本和标签的位置都会根据不同的本地化Thread.CurrentThread.CurrentUICulture进行更改 我们注意到的一件事是,来自远程加载的dll的任何表单或报表都不会被正确本地化。包含插件不同资源的本地化dll位于何处似乎并不重要,无论是主窗体旁边、插件dll旁边还是其他任何位置。当程序集本身在主程序运行时加载时,如何使程序集正确定位其本地化

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

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

我确实有一些代码非常类似于所使用的方法,但如果可能的话,我不希望必须针对表单本身手动实现resx。我的代码直接位于插件本身内部,只要CurrentUICulture不是“en-US”,就会调用它

理想情况下,我要寻找的是加载与我刚加载的插件直接关联的
pluginName.resources.dll
。我确实在我的主项目bin文件夹中看到了不同的文件夹,es文件夹包含一个
main.resources.dll
,但上次尝试时,简单地将插件dll放在该文件夹中似乎不起作用,尽管理论上这可能已经改变了…或者我当时可能做得不对

加载程序集[代码段]

    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);
            }
        }
编辑:关于该主题的更多想法


是否有某种方法可以拦截尝试解析附属程序集的加载结构,我可以实现一个事件,或者我可以重写一个函数,在这里我可以手动将代码指向正确的资源程序集?。我发现了一些关于程序集解析的内容,但这是用于直接加载,而不是用于卫星资源。

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

问题是,每个新线程都默认为CultureInfo.InstalledCulture,直到有人告诉它其他情况

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

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


这将使库的线程区域性与主程序的线程区域性保持一致,而不管操作系统对它的看法如何。

正如您所知,运行库通过查找附属程序集(例如
fr/pluginName.resources.dll
)使用约定加载本地化资源

我认为您认为这个问题可能是由于找不到这些卫星组件造成的,这可能是正确的。您可以尝试使用.NET Framework诊断工具确认这一点。您还可以尝试将附属程序集部署到全局程序集缓存(GAC)作为快速修复(请参阅在上的全局程序集缓存中安装附属程序集)

如果可行,并且为了帮助找出其他合适的位置(GAC除外),运行时检查以查找卫星程序集的位置记录为此处的回退过程:

是否从当前目录加载插件?嗯。
filePath
几乎是一个静态路径,但它不是“当前”目录,而是它下面某个地方的子目录。插件的存储结构是
(CurrentDirectory)/Plugins/(PluginName)/plugin.dll
文件路径将包含插件dll实际路径的
插件/(PluginName)/plugin.dll
部分。我不知道fuslogvw会捕获丢失的卫星,我必须尝试一下。希望不久的某个时候我能有一些空闲时间来玩这个。