Как заставить определенный файл .resx использоваться в DLL WPF?

У меня есть DLL WPF, вызываемая из неуправляемой DLL. Библиотека WPF DLL содержит диалоговое окно, которое было переведено (два набора файлов .resx).

Если я вызываю WPF DLL из оболочки WinForm или другой оболочки WPF, я могу принудительно перевести диалог на определенный язык (файл .resx), установив культуру текущего потока.

Однако при вызове DLL WPF (через взаимодействие - COM) из DLL C++ я не могу заставить диалоговое окно WPF переключаться на любой язык, кроме языка по умолчанию.

Мне не обязательно читать текущую культуру системы, потому что неуправляемая DLL делает это по-другому. Я хотел бы сообщить WPF DLL, какой язык использовать при его запуске.

Как я могу заставить его загружать определенный язык во время выполнения?


person Jason    schedule 18.11.2009    source источник


Ответы (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. В окне отображается неправильная культура

Такая последовательность событий возможна в зависимости от реализации кода привязки управляемого собственного потока. Поэтому я предлагаю вам попробовать сделать и то, и другое в одном вызове, чтобы посмотреть, изменит ли это что-нибудь.

person Ray Burns    schedule 19.11.2009
comment
Да, вот как мы это делаем... это работает при вызове с хоста WPF, хоста WinForm, но не с неуправляемого хоста. Спасибо. - person Jason; 19.11.2009