Не могу заставить MSMQ Com найти мою очередь - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь получить количество сообщений в моем MSMQ.Я обнаружил этот код в Интернете (много раз):

// setup the queue management COM stuff
MSMQManagement _queueManager = new MSMQManagement();

object machine = "MyLaptopComputer";
object path = @"DIRECT=OS:MyLaptopComputer\PRIVATE$\MyQueue";

_queueManager.Init(ref machine, ref path);

Console.WriteLine(_queueManager.MessageCount);

Marshal.ReleaseComObject(_queueManager);

Каждый раз, когда я получаю _queueManager.Init, происходит сбой с этой ошибкой:

Указано имя пути очерединеверно.

Я проверил (и дважды проверил) имя моей очереди, чтобы убедиться, что это не так.Я пробовал разные очереди, разные машины, удаленный запуск, локальный запуск ... Ничего не работает.

Я также пробовал варианты в приведенном выше коде.Например, я попытался:

_queueManager.Init("MyLaptopComputer", @"DIRECT=OS:MyLaptopComputer\PRIVATE$\MyQueue");

Очереди используются с NServiceBus и прекрасно работают, когда я использую NServiceBus для доступа к ним.

Есть ли у кого-нибудь идея о том, как я могу получить этоработать?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Я думаю, проблема в том, что ошибка, которую вы получаете, немного вводит в заблуждение. MSMQManagement.Init принимает 3 параметра. Все они необязательны, поэтому на других языках (например, на VB) вы иногда увидите, что он вызывается только с двумя параметрами.

Существует проект CodeProject , который показывает, как делать то, что вы делаете в C #:

private int GetMessageCount(string queueName)
{
    int count = 0;
    try
    {

        MSMQ.MSMQManagement mgmt = new MSMQ.MSMQManagement();
        MSMQ.MSMQOutgoingQueueManagement outgoing;
        String s = "YOURPCNAME";
        Object ss = (Object)s;
        String pathName = queueName;
        Object pn = (Object)pathName;
        String format = null;
        Object f = (Object)format;

        mgmt.Init(ref ss , ref f, ref pn);

        outgoing = (MSMQ.MSMQOutgoingQueueManagement)mgmt;
        count = outgoing.MessageCount;

    }
    catch (Exception ee)
    {
        MessageBox.Show(ee.ToString());
    }
    return count;
}

Это может обеспечить лучшую отправную точку.

0 голосов
/ 08 марта 2012

Оказывается, это была комбинация проблем. Самое большое, что мне нужно было использовать FormatName, а не имя пути.

_queueManager.Init("MyComputer", null, @"DIRECT=OS:MyComputer\PRIVATE$\MyQueue");

Кроме того, оно выдаст исключение, если очередь пуста ...

Должен любить интерфейсы COM. :)

...