.NET CF - MSMQ ActivateDevice () Сбой - PullRequest
       35

.NET CF - MSMQ ActivateDevice () Сбой

0 голосов
/ 23 октября 2010

У меня есть приложение .NET 3.5 Compact Framework, которое использует MSMQ.Мы запускаем это приложение на устройстве Intermec CN3, Windows Mobile 5.0.

Однако, когда наше приложение впервые пытается активировать службу MSMQ с помощью ActivateDevice (pinvoke), приложение вылетает, и мы получаем сообщение об ошибке:

Произошла проблема с myApp.exe

Пожалуйста, сообщите Microsoft об этой проблеме, не требуя затрат.и т. д.

Мы сделали следующее:

  1. Аппаратная перезагрузка устройства
  2. Установка NETCFv35.wm.armv4i.cab
  3. Установить msmq.arm.CAB
  4. * Запустить консольное приложение CF, которое настраивает MSMQ и реестр
  5. Программный сброс КПК
  6. * Запустить наше приложение, которое вызывает 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он компактный каркас?

1 Ответ

0 голосов
/ 31 августа 2011

Да, эта проблема возникает. Быстрое и простое решение этой проблемы - поместить код в отдельный исполняемый файл, а затем при запуске приложения запустить этот процесс и дождаться его завершения. Процесс завершится из-за сбоя, но вернется, если ваше вызывающее приложение все еще не повреждено. Затем просто убедитесь, что исполняемый файл развернут в вашей кабине, чтобы приложение могло его вызывать.

...