我正在使用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完成。
答案 0 :(得分: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设备断开连接时出现类似错误。但在我的情况下,我在自动生成的WMI包装类中得到它,我在LibUsbDotNet事件处理程序中调用它。