1

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

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

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

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

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

4

1 回答 1

1

可以尝试的东西:

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

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

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

  1. 您调用托管代码来设置文化。
  2. 创建了一个新的托管线程
  3. 您的调用返回,托管线程被释放。
  4. 您调用托管代码来创建和显示窗口。
  5. 创建了一个新的托管线程
  6. 窗口显示错误的文化

这样的一系列事件是可以想象的,这取决于托管本地线程绑定代码的实现。因此,我建议您尝试在一次调用中同时执行这两项操作,看看它是否会改变任何内容。

于 2009-11-19T00:05:03.113 回答