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:
- Hard Reset de l'appareil
- Installer NETCFv35.wm.armv4i.cab
- Installer msmq.arm.CAB
- * Exécutez une application de console CF qui configure MSMQ et le registre
- Réinitialisation logicielle du PDA
- * 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?