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)
编辑:关于这个主题的更多想法
有没有办法拦截试图解析附属程序集的加载结构,我可以实现的事件或我可以覆盖的函数,我可以手动将代码指向正确的资源程序集?我发现了一些关于装配分辨率的东西,但这是用于直接加载,而不是用于卫星资源.
正如您在问题背景中指出的那样,.NET 系统在加载资源程序集时使用 Thread.CurrentThread.CurrentUICulture 。
问题是每个新线程都默认为CultureInfo.InstalledCulture,除非另有说明。
让您的主代码在初始化调用中将所需的区域性传递给库。
然后在加载任何资源之前让库设置其Thread.CurrentThread.CurrentUICulture(以及.CurrentCulture,如果适用)。例如,这将是在调用InitializeComponent()或TryFindResource()之前。
这使得库的线程文化与主程序的线程文化保持一致,无论操作系统对此有何想法。
| 归档时间: |
|
| 查看次数: |
1101 次 |
| 最近记录: |