1

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 コンポーネントで要求を処理するためにプロキシは使用されません。これにより、破損やデータ損失が発生する可能性があります。この問題を回避するには、内部に存在する COM コンポーネントを表す RuntimeCallableWrappers でアプリケーションが完全に完了するまで、すべてのコンテキスト/アパートメントが有効なままであることを確認してください。

4

1 に答える 1

0

おそらく、内部の例外で別の例外を見つけることができます。

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デバイスが切断されたときに同様のエラーが発生しました。しかし、私の場合は、LibUsbDotNetイベントハンドラーで呼び出した自動生成されたWMIラップクラスで取得しました。

于 2011-11-30T05:33:58.823 に答える