У меня есть приложение .NET 3.5 Compact Framework, которое использует MSMQ.Мы запускаем это приложение на устройстве Intermec CN3, Windows Mobile 5.0.
Однако, когда наше приложение впервые пытается активировать службу MSMQ с помощью ActivateDevice (pinvoke), приложение вылетает, и мы получаем сообщение об ошибке:
Произошла проблема с myApp.exe
Пожалуйста, сообщите Microsoft об этой проблеме, не требуя затрат.и т. д.
Мы сделали следующее:
- Аппаратная перезагрузка устройства
- Установка NETCFv35.wm.armv4i.cab
- Установить msmq.arm.CAB
- * Запустить консольное приложение CF, которое настраивает MSMQ и реестр
- Программный сброс КПК
- * Запустить наше приложение, которое вызывает ActivateDevice() при запуске
После выполнения программного сброса при первом вызове ActivateDevice () происходит сбой приложения.
Однако теперь, когда мы вызвали ActivateDevice (),Службы MSMQ работают на устройстве, по крайней мере, до его повторного мягкого сброса.
Кроме того, любые вызовы ActivateDevice () не приводят к сбою приложения.
Консольное приложение, которое мы запускаем после жесткогоСброс в основном так:
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);
}
В наших приложениях вызов ActivateDevice () в основном таков:
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 () по-прежнему вызывает сбой нашего приложения, когда устройство выполняет мягкий сброс.
Кто-нибудь еще испытывал это с MSMQ на tон компактный каркас?