AppDomain и родные сообщения окна - PullRequest
2 голосов
/ 22 декабря 2009

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

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

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

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

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

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

Исключение, которое выдается:

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

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

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

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

Возможно, есть еще какие-нибудь предложения?

Спасибо, Roger

1 Ответ

1 голос
/ 06 июля 2010

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

Удачи, Roger

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...