2009-11-18 13 views
1

J'ai une DLL WPF appelée à partir d'une DLL non managée. La DLL WPF a une boîte de dialogue qui a été traduite (deux ensembles de fichiers .resx). Si j'appelle la DLL WPF à partir d'un shell WinForm ou d'un autre shell WPF, je peux forcer la boîte de dialogue à une langue particulière (fichier .resx) en définissant la culture du thread en cours.Comment forcer l'utilisation d'un fichier .resx particulier dans une DLL WPF?

Toutefois, lors de l'appel de la DLL WPF (via interop-COM) à partir de la DLL C++, je ne peux pas obtenir la boîte de dialogue WPF pour basculer vers une autre langue que la langue par défaut.

Je n'ai pas nécessairement besoin de lire la culture système en cours, car la DLL non managée le fait différemment. Je voudrais dire à la DLL WPF quelle langue utiliser quand je l'exécute.

Comment puis-je le forcer à charger avec une langue particulière à l'exécution?

Répondre

1

Quelque chose à essayer:

Définir la culture et de créer la boîte de dialogue en un seul appel, comme celui-ci:

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

Lors de l'appel de C++ par Interop, NET Framework doit lier votre fil natif à un Filetage NET Framework. Je ne me souviens pas des détails, mais je me souviens de quelque chose à propos d'un mécanisme où les threads NET Framework sont réutilisés et récupérés. Si vous appelez le code managé qui définit la culture et un second appel pour créer la fenêtre, un scénario possible est:

  1. Vous appelez le code managé pour définir la culture.
  2. Un nouveau thread géré est créé
  3. Votre appel est renvoyé et le thread géré est libéré.
  4. Vous appelez le code managé pour créer et afficher la fenêtre.
  5. Un nouveau thread géré est créé
  6. La fenêtre affiche avec la mauvaise culture

Une telle séquence d'événements est envisageable, en fonction de la mise en œuvre du code de liaison fil mangaged natif. Par conséquent, je suggère que vous essayez de faire les deux en un seul appel pour voir si cela change quelque chose.

+0

Oui, c'est comme cela que nous le faisons ... cela fonctionne quand on l'appelle depuis un hôte WPF, un hôte WinForm mais pas depuis un hôte non géré. Merci. – Jason