2

Dans la solution, j'ai plusieurs fichiers .exe qui se trouvent dans le même répertoire. L'un d'entre eux est un menu principal, qui recherche le chemin de tous les autres exécutables (dans le même répertoire) et les assigne aux boutons du formulaire. Lorsque le bouton est cliqué, l'exe sous-jacent est lancé via Process.Start().Windows Mobile 6.5 - TypeLoadException sur Process.Start()

Chaque exe est emballé dans une installation séparée CAB. Après l'installation initiale, j'exécute le menu principal, puis sélectionne les boutons et les lancements d'applications sous-jacents avec succès. Je le quitte, puis exécutez à nouveau le même ou toute autre application, mais cette fois-ci se bloque avec:

TypeLoadException 
    at System.Windows.Forms.Control.OnGotFocus(EventArgs e) 
    at System.Windows.Forms.Control.WnProc(WM wm, Int32 wParam, Int32 lParam) 
    at System.Windows.Forms.Control._InternalWnProc(WM wm, Int32 wParam, Int32 lParam) 
    at Microsoft.AGL.Forms.WL.SetFocus(IntPtr hwnFocus) 
    at System.Windows.Forms.Control.Focus() 
    at myApp.Login..ctor() 
    at myApp.Form_UnderApp1.InitializeComponent() 
    at myApp.Form_UnderApp1..ctor() 
    at myApp.Program.Main() 

myApp.Login est un UserControl qui a TextBox.Focus() dans son constructeur. J'ai essayé de le déplacer vers le gestionnaire d'événements 'Validated' mais le résultat est le même, avec une différence que cette fois il se bloque sur Form.Load() en essayant de définir sa propre visibilité.

Le cycle peut être répété après la réinitialisation de l'appareil. Plus important encore, si je lance l'un des exécutables enfants directement ceux qui se lancent et fonctionnent bien tout le temps.

Le même jeu de codes fonctionne correctement sur WinMo 6.1. J'utilise aussi la classe Application2 d'OpenNETCF - j'ai essayé de la remplacer par la classe standard Application avec le même résultat. Je ai essayé de mettre Process.StartInfo.WorkingDirectory et UseShellExecute mais encore aucune joie. Lorsque vous regardez l'objet Process() dans l'application "Menu principal" - il se comporte comme prévu (crée le processus, retourne 'vrai' sur .Start() etc).

Aucun assembly n'est installé sur GAC, tous les fichiers résident dans le même répertoire.

Des indices?

[Modifier]

Après je reçois l'erreur et le dispositif est laissé intact pendant environ 10 minutes tout revient à commencer: je peux courir à nouveau sous-application une fois, etc. Giving que j'ai essayé d'essuyage référence à processus en cours à partir de mon menu principal, en tuant le processus, en appelant GC.Collect() sans résultat.

[Modifier]

journal Loader semble ok jusqu'à ce point (c'est là application commence à ne pas):

Redirecting [Microsoft.WindowsCE.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] to [Microsoft.WindowsCE.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] 
Loading module [\windows\GAC_Microsoft.WindowsCE.Forms_v3_5_0_0_cneutral_1.dll] 
Loaded [Microsoft.WindowsCE.Forms, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] from [\windows\GAC_Microsoft.WindowsCE.Forms_v3_5_0_0_cneutral_1.dll] 
Loading module [\Program Files\MyApp\System.SR.dll] 
Attempt to load [\Program Files\MyApp\System.SR.dll] has failed (err 0x80001000). 
Loading module [\Program Files\MyApp\System.SR.exe] 
Attempt to load [\Program Files\MyApp\System.SR.exe] has failed (err 0x80001000). 
Loading module [\windows\System.SR.dll] 
Attempt to load [\windows\System.SR.dll] has failed (err 0x80001000). 
Loading module [\windows\System.SR.exe] 
Attempt to load [\windows\System.SR.exe] has failed (err 0x80001000). 
Failed to load [System.SR, Version=3.5.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC] 

Après avoir copié System.SR.dll à app installdir:

Loading module [\windows\en\System.SR.resources.dll] 
Attempt to load [\windows\en\System.SR.resources.dll] has failed (err 0x80001001) 

Installée et NETCFv2.wm.armv4i.cab mais maintenant le journal indique que l'un des dll spécifiques à l'appareil (ITCScan.DLL) ne peut pas être l oaded, que je crois être l'assemblage .NET 3.5. Pour autant que je sache, System.SR est utilisé seulement dans .NET2, n'est-ce pas qu'une autre exception essaie de faire surface et se manifeste comme ça?

+0

Avez-vous essayé d'activer la journalisation et de regarder le journal du chargeur pour voir ce qui pourrait se produire? (http://msdn.microsoft.com/en-us/library/ms229650%28v=VS.90%29.aspx) – ctacke

+0

@ctacke Loader log m'a laissé plus confus (poste mis à jour), je vais continuer à regarder – StaWho

+0

FYI: ITCScan n'est pas un assembly .NET 3.5. C'est une bibliothèque native d'Intermec. – pdriegen

Répondre

0

Je suppose que le premier exécutable que vous exécutez (appelez-le Exe A) est toujours en cours d'exécution.

Lorsque quelqu'un clique sur le bouton qui correspond à Exe A dans votre menu, regardez tous les processus en cours pour voir s'il est déjà en cours d'exécution.Si oui, tirez simplement Exe A vers l'avant.

Ce n'est peut-être pas la solution à votre problème, mais c'est la première chose qui me vient à l'esprit lorsque je lis ce que vous décrivez. Sous Windows Mobile, une application ne se ferme pas nécessairement lorsque quelqu'un la ferme à moins que le créateur de cette application ne le fasse.

J'espère que cela aide.

+0

Je m'assure que c'est le cas. Le processus disparaît de la liste après la fermeture de l'Exe A. – StaWho

1

J'ai eu le même problème et je n'ai pas pu le résoudre. J'ai dû chercher un autre moyen d'appeler les applications.

Ce que je l'ai fait est mis paramètres dans le constructeur du formulaire B puis de l'appeler A. Ces paramètres sont les mêmes que les arguments du fichier .exe de l'application B.

Indicatif téléphonique:

MyAppNameSpace.MyForm _B = new MyAppNameSpace.MyForm(UserID,Date,this); 
F.Show(); 

Constructeur:

public MyForm(string _U, DateTime _d, Form _PrevForm) 
{ 
    Form A = _PrevForm; 
    string U = _U; 
    DateTime d = _d; 
    InitializeComponent(); 
} 

App B a un paramètre supplémentaire dans le constructeur qui est la forme A. J'utilise cette forme pour gérer le application.exit() . L'appel de cette fonction fermera tout le système (APP A et B). Au lieu de cela, vous devriez utiliser le A.show();

public void BackToAppA() 
{ 
    A.show(); 
} 
Questions connexes