2010-10-22 21 views
0

J'ai une application .NET 3.5 Compact Framework qui utilise MSMQ. Nous exécutons cette application sur un périphérique Intermec CN3, Windows Mobile 5.0..NET CF - MSMQ ActivateDevice() Crash

Cependant, lorsque notre première application essaie au service MSMQ actif avec ActivateDevice (PInvoke), l'application se bloque et nous obtenons le message du rapport d'erreur:

Un problème a occuurred avec MyApp.exe

Signaler ce problème à Microsoft, sans frais supplémentaires. ect ..

Ce que nous avons fait est la suivante:

  1. Hard Reset de l'appareil
  2. Installer NETCFv35.wm.armv4i.cab
  3. Installer msmq.arm.CAB
  4. * Exécutez une application de console CF qui configure MSMQ et le registre
  5. Réinitialisation logicielle du PDA
  6. * Exécutez notre application quel cal ls ActivateDevice() au démarrage

Après une réinitialisation logicielle, la première fois que ActivateDevice() est appelée, l'application se bloque. Cependant, maintenant que nous avons appelé ActivateDevice(), les services MSMQ travaillent sur l'appareil au moins jusqu'à ce qu'il soit de nouveau réinitialisé.

En outre, tous les appels à ActivateDevice() ne planteront pas l'application.

L'application de la console que nous courons après un redémarrage à froid est essentiellement ceci:

class InstallRegister 
{ 
    public void Main() 
    { 
     RunMsmqAdmin("install"); 
     RunMsmqAdmin("register install"); 
     RunMsmqAdmin("register"); 

     SetQuotaValueRegistry("MachineQuota"); 
     SetQuotaValueRegistry("DefaultLocalQuota"); 
     SetQuotaValueRegistry("DefaultQuota"); 

     RunMsmqAdmin("enable binary"); 
     RunMsmqAdmin("enable srmp"); 
     RunMsmqAdmin("start"); 

     RegFlushKey(0x80000002); 
    } 

    private void SetQuotaValueRegistry(string quotaValueName) 
    { 
     Microsoft.Win32.Registry.SetValue(
       "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\MSMQ\\SimpleClient\\" 
       , quotaValueName 
       , 100000); 
    } 

    private void RunMsmqAdmin(string command) 
    { 
     using (Process _process = new Process()) 
     { 
      _process.StartInfo.FileName = @"\windows\msmqadm.exe"; 
      _process.StartInfo.Arguments = command; 
      _process.StartInfo.UseShellExecute = true; 
      _process.Start(); 
      _process.WaitForExit(); 
     } 
    } 
    [System.Runtime.InteropServices.DllImport("CoreDll.dll", EntryPoint = "RegFlushKey", SetLastError = true)] 
    private static extern uint RegFlushKey(uint hKey); 
} 

Nos applications appellent à ActivateDevice() est essentiellement ceci:

class ActivateMSMQ 
{ 
    public void Active() 
    { 
     var handle = ActivateDevice("Drivers\\BuiltIn\\MSMQD", 0); 
     CloseHandle(handle); 
    } 
    [System.Runtime.InteropServices.DllImport("CoreDll.dll", SetLastError = true)] 
    private static extern IntPtr ActivateDevice(string lpszDevKey, Int32 dwClientInfo); 

    [System.Runtime.InteropServices.DllImport("CoreDll.dll", SetLastError = true)] 
    private extern static Int32 CloseHandle(IntPtr hProcess); 
} 

ActivateDevice() provoque encore notre application le crash chaque fois que l'appareil est réinitialisé.

Quelqu'un d'autre a-t-il expérimenté cela avec MSMQ sur la structure compacte?

Répondre

0

Oui, ce problème se produit. la solution rapide et facile pour cela est de mettre le code dans un exécutable distinct, puis au début de votre application, lancez ce processus et attendez la fin. Le processus se termine en raison de l'erreur, mais retournera avec votre application d'appel toujours intacte. Ensuite, assurez-vous que l'exécutable est déployé dans votre cabine pour que vous puissiez l'appeler.