2009-11-18 2 views
1

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

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

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

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

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

ответ

1

Что попробовать:

Установите культуру и создать диалог в одном вызове, например:

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

При вызове из C++ через Interop, NET Framework должен связать свою родную тему NET Framework. Я не помню подробностей, но я помню что-то о механизме, в котором потоки NET Framework повторно используются и собираются мусор. Если вы звоните в управляемый код, который устанавливает культуру и второй вызов для создания окна, возможен сценарий:

  1. Вы вызываете управляемый код для установки культуры.
  2. Создан новый управляемый поток
  3. Ваш вызов возвращается, и управляемый поток освобождается.
  4. Вы вызываете управляемый код для создания и отображения окна.
  5. новый управляемый поток создаются
  6. окно показывает с неправильной культурой

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

+0

Да, так мы это делаем ... он работает при вызове с хоста WPF, хоста WinForm, но не из неуправляемого хоста. Благодарю. – Jason