如何强制在WPF DLL中使用特定的.resx文件?

时间:2009-11-18 23:44:54

标签: wpf localization cultureinfo

我有一个从非托管DLL调用的WPF DLL。 WPF DLL有一个已翻译的对话框(两组.resx文件)。

如果我从WinForm shell或其他WPF shell调用WPF DLL,我可以通过设置当前线程的Culture来强制对话框为特定语言(.resx文件)。

但是,当从C ++ DLL调用WPF DLL(通过interop-COM)时,我无法让WPF对话框切换到默认语言以外的任何语言。

我不一定需要阅读当前的系统文化,因为非托管DLL以不同的方式执行。我想告诉WPF DLL我运行它时使用什么语言。

如何在运行时强制使用特定语言加载?

1 个答案:

答案 0 :(得分:1)

要尝试的东西:

设置文化并在一次调用中创建对话框,如下所示:

// Managed code
void SetCultureAndShowWindow(CultureInfo culture, ... more parameters for creating window ...)
{
  Thread.CurrentThread.CurrentCulture = culture;
  Window window = new Window(...
  window.ShowDialog();
}

通过interop从C ++调用时,.NET Framework必须将本机线程绑定到.NET Framework线程。我不记得细节,但我记得一些关于.NET Framework线程被重用和垃圾收集的机制。如果您正在调用设置文化的托管代码并且第二次调用以创建窗口,则可能的情况是:

  1. 您调用托管代码来设置文化。
  2. 创建新的托管线程
  3. 您的呼叫返回,托管线程被释放。
  4. 您调用托管代码来创建并显示窗口。
  5. 创建新的托管线程
  6. 窗口显示错误的文化
  7. 根据mangaged-native线程绑定代码的实现,可以想到这样的事件序列。因此,我建议您尝试在一次调用中同时查看它是否会发生任何变化。