2013-05-16 31 views
7

Tôi có một giải pháp trong phòng thu trực quan 2010 chứa 2 dự án, một là ứng dụng giao diện điều khiển C#, mà tôi sẽ gọi là Foo và ứng dụng kia là ứng dụng CLR C++ , mà tôi sẽ gọi là Bar. Bar là một exe không phải là một dll. Khi phiên Debug bắt đầu, hãy bắt đầu bằng cách chạy Foo. Foo bắt đầu Quy trình của Thanh bằng cách sử dụng mã System.Diagnostics.Process procBar = System.Diagnostics.Process.Start(pathToBarEXE) Tôi muốn sau đó đính kèm Bar.exe đó vào trình gỡ lỗi hiện đang chạy theo lập trình. Tôi có một chức năng được cho là để làm điều đó (nhìn thấy nó ở khắp mọi nơi trên internet)Đính kèm quy trình thứ hai vào VS2010 theo lập trình với .NET

public void AttachToProcess(int processId) 
    { 
     foreach (EnvDTE.Process process in DTE.Debugger.LocalProcesses) 
     { 
      if (process.ProcessID == processId) 
      { 
       process.Attach(); 
       DTE.Debugger.CurrentProcess = process; 
      } 
     } 
    } 

nhưng chức năng không biên dịch, vì DTE là một giao diện. Tôi đã sửa đổi chức năng thusly

public void AttachToProcess(int processId) 
    { 
     EnvDTE80.DTE2 dte2; 
     dte2 = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0"); 
     foreach (EnvDTE.Process process in dte2.Debugger.LocalProcesses) 
     { 
      if (process.ProcessID == processId) 
      { 
       process.Attach(); 
      } 
     } 
    } 

và nó biên dịch và chạy, nhưng khi nó tìm thấy quá trình Bar, câu lệnh if ném ngoại lệ The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)) Tôi đang làm gì sai ở đây?

Trả lời

1

Họ nói ở đây:

http://msdn.microsoft.com/en-us/library/ms228772.aspx

rằng đó là vì COM có một số vấn đề đối phó với các ứng dụng đa luồng. Họ đang trình bày mã mẫu, mời bạn sử dụng IOleMessageFilter để thử lại cuộc gọi khi bạn bị từ chối như thế này.

Các vấn đề liên quan