пятница, 19 октября 2007 г.

Unable to attach to the process


Вот такое сообщение я получил от студии, когда попытался подключиться к IE, чтобы отладить панельку, написанную на C#. Кстати, хорошая и почти единственная статья о том, как сделать свой тулбар для эксплорера, написана вот здесь: Extending Explorer with Band Objects using .NET and Windows Forms. А теперь - детально. Панель для эксплорера представляет собой так называемый COM Callable Wrapper (CCW) и была написана на .NET 1.1 в Visual Studio 2003 - аттачился я, соответственно, в ней же. Как вы уже поняли, такой способ не сработал. Затем я попытался отладить компонент при помощи другого хост-контейнера (ActiveX Control Test Container) – та же ерунда. Думаю, ладно не студия, так WinDbg. Пусть не так удобно, но на безрыбье и рак рыба. Приатачился! Собирался подгрузить SOS.dll и тут обратил внимание, что в процесс IE загрузился не .NET 1.1 a .NET 2.0! Снес с машины второй фреймворк (к счастью, у меня была такая возможность). И опа! - все хоккей, студия замечательно подключилась. По правде говоря, с СОМом из .NET активно не работал и по этому был немало удивлен. Навел справки. Оказывается, при активации CCW по умолчанию запускается старшая по версии CLR из установленных на машине. (см. статью MSDN Configuring a COM Application for Side-By-Side Execution), однако это поведение можно изменить при помощи config-файла для приложения, которое активирует CCW. В статье есть примечание, что такой подход не работает для Internet Explorer и Microsoft Office :). Решил проверить. Поставил обратно NET 2.0 и убедился, что в IE грузится именно он. Затем создал файл IEXPLORE.EXE.config:
<?xml version ="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v1.1.4322" safemode="false"/>
</startup>
</configuration>

К удивлению обнаружил что для IE 6.0 все замечательно работает и подгружается именно версия 1.1.4322. Конечно, для продакшена такой подход не годится, но для отладки при разработке – вполне.

2 комментария:

Анонимный комментирует...

Добрый день аФФтар!

Что ж Вы, уважаемый такие умные вещи не применяли гогда песали вот такое:

System.Web.Services.Protocols.SoapException: Server was unable to process request.
--> File or assembly name Ranet.BusinessFramework.DataServices.Descriptors, or one of its dependencies, was not found.
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Ranet.Framework.Windows.WebData.WebDataService.ReadByFilter(String dataServiceId, Boolean isOql, String filter) in D:\VSS\Repository\Projects\Ranet.Framework v2.3\Ranet.Framework.Windows\Web References\WebData\Reference.cs:line 184
at Ranet.BusinessFramework.Windows.RBFApplicationManager.GetDataServiceList(String typeName)
at Ranet.BusinessFramework.Windows.RBFApplicationManager.GetDefaultPickForm(String typeName)
at Ranet.Framework.Windows.Forms.BaseForm.GetLookUpPickForm(Control sender, String type) in D:\VSS\Repository\Projects\Ranet.Framework v2.3\Ranet.Framework.Windows\Forms\BaseForm.cs:line 1565
at Ranet.Framework.Northwind.Forms.OrderCardForm.GetLookUpPickForm(Control sender, String type) in c:\program files\ranet 2007\samples\northwind\sources\ranet.framework.northwind.forms\ordercardform.cs:line 3361
at Ranet.Framework.Windows.Forms.BaseForm.GetPickForm(Control pickCtrl, ILookUpData data) in D:\VSS\Repository\Projects\Ranet.Framework v2.3\Ranet.Framework.Windows\Forms\BaseForm.cs:line 2951
at Ranet.Framework.Windows.Forms.BaseForm.ShowMultiChoicePickForm(Control lookUpControl) in D:\VSS\Repository\Projects\Ranet.Framework v2.3\Ranet.Framework.Windows\Forms\BaseForm.cs:line 2541
at Ranet.Framework.Windows.Forms.BaseForm.OnMultipleLookUpButtonClick(Object sender, ButtonPressedEventArgs e) in D:\VSS\Repository\Projects\Ranet.Framework v2.3\Ranet.Framework.Windows\Forms\BaseForm.cs:line 2525
at DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit.RaiseButtonClick(ButtonPressedEventArgs e)
at DevExpress.XtraEditors.ButtonEdit.OnClickButton(EditorButtonObjectInfoArgs buttonInfo)
at DevExpress.XtraEditors.ButtonEdit.OnMouseUp(MouseEventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at DevExpress.Utils.Controls.ControlBase.WndProc(Message& m)
at DevExpress.XtraEditors.BaseEdit.WndProc(Message& m)
at DevExpress.XtraEditors.TextEdit.WndProc(Message& msg)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

:) С уважением. Доброжелатель

Андрей Бороздин комментирует...

Применял. По этому и не задвал таких бестолковых вопросов.