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会捕获丢失的卫星,我必须尝试一下。希望不久的某个时候我能有一些空闲时间来玩这个。