Un ghid practic

Dacă programați din punct de vedere vizual programul Visual Studio dintr-o aplicație externă (în afara procesului) multithreaded, pot apărea următoarele erori.

Aplicația este ocupată (RPC_E_CALL_REJECTED 0x80010001).







Apelul a fost respins (RPC_E_SERVERCALL_RETRYLATER 0x8001010A).

Aceste erori apar din cauza conflictelor de fire între aplicațiile multithreaded și Visual Studio. Aceste erori pot fi evitate prin implementarea procesatorilor de evenimente IOleMessageFilter din aplicația de automatizare Visual Studio. (Nu confunda IOleMessageFilter cu System.Windows.Forms.IMessageFilter.)

Depanarea

Adăugați următoarea clasă la aplicația dvs.

Adăugați o legătură COM la mediul de dezvoltare Microsoft Development Environment 8.0. În acest caz, link-ul va fi adăugat la EnvDTE și EnvDTE80.

Adăugați o referință la System.Windows.Forms.

În cod, creați o instanță a EnvDTE80, așa cum este descris în exemplul următor.

Solicitați mesajul.Registrați pentru a gestiona erorile de filete.

Apelați codul dvs. de automatizare în mod obișnuit.







Când codul de automatizare este gata, apelați Message.Revoke pentru a elimina dispozitivele de gestionare a erorilor de fir.

Când direcționați apeluri dintr-o aplicație externă, cu mai multe fire în Visual Studio, acestea trec prin interfața COM. COM uneori are probleme cu procesarea corectă a firelor, în special în ceea ce privește timpul. Ca rezultat, uneori, un thread de intrare dintr-o aplicație externă nu poate fi procesat de Visual Studio la momentul primirii, ceea ce duce la erorile descrise mai sus. Cu toate acestea, erorile nu apar dacă apelul provine dintr-o aplicație care rulează în Visual Studio (în curs), cum ar fi o macrocomandă sau un add-in. Pentru o descriere mai detaliată a cauzelor erorilor, consultați Suportul fluxului în Office.

Pentru a preveni erorile, punerea în aplicare a funcției de tratare a IOleMessageFilter în aplicația dumneavoastră. În acest caz, în cazul în care fluxul cererii externe trimite apelul la Visual Studio și este apoi deviat (de exemplu, de la metoda IOleMessageFilter.HandleIncomingCall returneaza SERVERCALL_RETRYLATER), aplicația va fi capabil să-l ocupe și încercați din nou, sau de a anula apelul. Pentru a face acest lucru, a crea un nou fir de aplicații Visual Studio într-un singur fir unitate (STA) și include codul de automatizare în handler IOleMessageFilter.

Adăugări la nivel comunitar

Afișare: Mijlocit protejat

Această pagină a fost utila? Da, nu

Au rămas 1500 de caractere

Mulțumesc! Vă mulțumim pentru feedbackul dvs. Opinia dvs. este foarte importantă pentru noi.

Centre de dezvoltare

comunitate

Contactați-ne







Articole similare

Trimiteți-le prietenilor: