我们的代码使用"插件"模型,远程加载符合主程序中定义的预定义结构IPluginModel
的dll。主程序本身有几个本地化表单,其中UI中标签的文本和位置都根据不同的本地化Thread.CurrentThread.CurrentUICulture
进行了更改。
我们注意到的一件事是来自远程加载的dll的任何表单或报告都不会被正确本地化。包含插件的不同资源的本地化dll所在的位置似乎并不重要,无论是在主窗体旁边,插件dll旁边还是其他任何位置。在主程序的RunTime期间加载程序集本身时,如何使程序集正确定位其本地化资源?
我的代码与Here使用的方法非常类似,但是如果可能的话,不希望必须手动对表单本身实现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);
}
}
编辑:关于此主题的更多想法
有没有办法拦截试图解析附属程序集的加载结构,我可以实现的事件或我可以覆盖的函数,我可以手动将代码指向正确的资源程序集?我发现了一些关于装配解决方案的东西,但那是为了直接装载,而不是用于卫星资源。
答案 0 :(得分:2)
正如您所熟知的,运行时通过查找附属程序集(例如fr/pluginName.resources.dll
)来使用约定加载本地化资源。
我认为您可能认为这个问题可能是由于未能找到这些附属装配而导致的。您可以尝试使用.NET Framework诊断工具fuslogvw.exe进行确认。您还可以尝试将附属程序集部署到全局程序集缓存(GAC)作为快速修复(请参阅this page上的在全局程序集缓存中安装Satellite程序集。)
如果可行,并帮助确定其他合适的位置(GAC除外),运行时检查以查找附属程序集的位置将记录为此处的回退过程: http://msdn.microsoft.com/en-us/library/sb6a8618%28v=vs.71%29.aspx