У меня проблема, которая также связана с сообщениями 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