AppDomain и собственные оконные сообщения

У меня проблема, которая также связана с сообщениями AppDomain и Windows.

Веб-страница, которая будет размещена в Internet Explorer и будет содержать производный элемент управления .Net WinForms UserControl — HelloWorldCtl. Этот элемент управления находится внутри написанной на C# сборки — HelloWorldControl.dll. Элемент управления использует код из другой сборки, написанной на C++/CLR — HelloWorldLibCPP.dll.

HelloWorldCtl загружает HelloWorldLibCPP.dll и вызывает код, который создает собственное окно Win32 и помещает это окно в область HelloWorldCtl.

Перейдите на веб-страницу, HelloWorldCtl загружается, я вижу ее, а также собственное окно в центре области HelloWorldCtl.

Как элемент управления С#, так и собственное окно имеют некоторые обработчики сообщений, и все сообщения работают нормально и достигают как окна элемента управления С#, так и собственного окна; щелчки мышью, перерисовка и т. д. Однако некоторым обработчикам сообщений собственного окна необходимо вызывать методы элемента управления C#, который является родителем собственного окна. Это делается с помощью интерфейса, который реализует элемент управления C# и на который родное окно содержит ссылку, сохраняя его в GCHandle (из System::Runtime::InteropServices). Я использовал шаблон gcroot‹> для GCHandle.

Сбой происходит в этот момент, когда код в собственном окне пытается использовать GCHandle для вызова любого метода элемента управления C#. (Код C++ компилируется как управляемый код с параметром /clr.)

Выбрасывается следующее исключение:

«Не удается передать GCHandle через домены приложений»

Я добавил код отладки для отображения Id и FriendName CurrentDomain как в C#, так и в собственном окне, и обнаружил, что эти домены приложений не совпадают.

Во время создания собственного окна CurrentDomain совпадает с элементом управления C#, но когда собственное окно получает сообщения и эти сообщения обрабатываются, CurrentDomain отличается от элемента управления C#.

Можно ли изменить эту ситуацию? Возможно ли, чтобы оба обработчика собственных оконных сообщений работали в том же AppDomain, что и элемент управления С#?

Возможно, есть другие предложения?

Спасибо, Роджер.


person Roger    schedule 22.12.2009    source источник
comment
Если кто-то готов ответить, мне было бы интересно услышать ответы.   -  person IAbstract    schedule 11.02.2010


Ответы (1)


Я действительно нашел решение рассматриваемой проблемы. Я успешно реализовал свой код аналогично тому, что описано в следующем посте из блога «Мысли из Mirality, случайные мысли и размышления от Miral в Mirality Systems» в теме «Неуправляемые обратные вызовы через домены приложений».

Удачи, Роджер

http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/

person Roger Khoueiry    schedule 06.07.2010