ManagementObject.InvokeMethod не найдено исключение

Я пытаюсь приостановить задание печати, используя WMI, ManagmentObjects и стандартные образцы кода для этого случая, но получаю ошибку, когда я пытаюсь вызвать метод паузы.

public static bool PausePrintJob(string printerName)
    {
        //var scope = new ManagementScope("root\\cimv2");

        //scope.Connect();

        bool isActionPerformed = false;
        string searchQuery = "SELECT * FROM Win32_PrintJob";
        ObjectQuery query = new ObjectQuery(searchQuery);
        ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(/*scope,*/ query);
        ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();

        if (prntJobCollection.Count > 0)
            System.Windows.Forms.MessageBox.Show("Print jobs founded for " + printerName);

        foreach (ManagementObject prntJob in prntJobCollection)
        {
            string jobName = prntJob.Properties["Name"].Value.ToString();
            System.Windows.Forms.MessageBox.Show("Job Name: " + jobName);
            //Job name would be of the format [Printer name], [Job ID]
            char[] splitArr = new char[1];
            splitArr[0] = Convert.ToChar(",");
            string prnterName = jobName.Split(splitArr)[0];
            string jobID = jobName.Split(splitArr)[1];
            string documentName = prntJob.Properties["Document"].Value.ToString();
            System.Windows.Forms.MessageBox.Show("Document Name: " + documentName);
            if (String.Compare(prnterName, printerName, true) == 0)
            {
                if (printerName.Equals(prnterName))
                {
                    System.Windows.Forms.MessageBox.Show("Pause calling...");
                    prntJob.InvokeMethod("Pause", null);
                    isActionPerformed = true;
                }
            }
        }
        return isActionPerformed;
    }

Я пробовал это с | без объема - результат тот же.

Исключение составляет

След стека

У меня нет опыта работы с ManagmentObjects. Хорошо, может быть, текущая логика не идеальна, и я должен использовать Win 32 API-вызовы, чтобы сделать это, как было дано в ответе на этот вопрос: Как приостановить Win32_printJob от Printername и JobID

но я запутался.

Как я читал на MSDN этот метод должен быть. https://msdn.microsoft.com/en-us/library/aa394370(v=vs.85).aspx

Имя класса, которое вернул prntJob.ClassPath.ClassName - Win32_PrintJob.

Кто-нибудь может объяснить или получить некоторые ссылки, чтобы прочитать о том, что может быть проблемой в этой ситуации? Как это работает? Как среда выполнения ищет методы в переносе ManagmentObject? Это правильный способ вызова членов через ManagmentObject? Есть ли в мире инструменты для отладки этого стека?

0 ответов

Другие вопросы по тегам