У меня проблема, которая также связана с сообщениями 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, что и элемент управления С#?
Возможно, есть другие предложения?
Спасибо, Роджер.