Контекст 0x3c74b38 отключен.Прокси-сервер не будет использоваться для обслуживания запроса в компоненте COM. - PullRequest
1 голос
/ 22 июля 2010

Я разрабатываю оконное приложение в Microsoft Visual C # 2008 Express Edition. Я получаю ошибку времени выполнения при запуске приложения.

string[] diskArray;
string driveNumber;
string driveLetter;

**searcher1 = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");**
foreach (ManagementObject dm in searcher1.Get()) 
{
    diskArray = null;
    driveLetter = getValueInQuotes(dm["Dependent"].ToString());
    diskArray = getValueInQuotes(dm["Antecedent"].ToString()).Split(',');
    driveNumber = diskArray[0].Remove(0, 6).Trim();
    if(driveLetter==this._driveLetter)
    {
        /* This is where we get the drive serial */
        ManagementObjectSearcher disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

        foreach (ManagementObject disk in disks.Get()) 
        {
            if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) & disk["InterfaceType"].ToString() == "USB") {
                this._serialNumber = parseSerialFromDeviceID(disk["PNPDeviceID"].ToString());

(в выделенной строке)

Контекст 0x3c74b38 отключен.Прокси-сервер не будет использоваться для обслуживания запроса в компоненте COM.Это может привести к повреждению или потере данных.Чтобы избежать этой проблемы, убедитесь, что все контексты / апартаменты остаются живыми до тех пор, пока приложение не будет полностью завершено с RuntimeCallableWrappers, которые представляют COM-компоненты, которые живут внутри них.

1 Ответ

0 голосов
/ 30 ноября 2011

Вероятно, вы можете найти во внутренних исключениях еще одно, например,

COMException: The application called an interface that was marshalled for a different thread.

Это означает, что вы должны вызывать свои методы в другом потоке. Вероятно, если вы просмотрите стек вызовов, вы найдете обработчик событий, который вызывает этот код. Просто используйте Invoke / BeginInvoke метод для вызова вашего кода. Смотрите пример ниже:

if (this.InvokeRequired) // in some cases this condition will not work
{
    this.BeginInvoke(new MethodInvoker(delegate() { this.Your_Method(); }));
    return;
}

Я получил похожую ошибку, когда USB-устройство было отключено. Но в моем случае я получил его в автоматически сгенерированном классе WMI Wrap, который я вызвал в обработчике событий LibUsbDotNet.

...