我遇到了与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#控件上的任何方法时,此时发生故障。 (使用/ clr将c ++代码编译为托管代码。)
引发的异常是:
“无法通过AppDomains传递GCHandle”
我放了一些调试代码来显示C#和本机窗口中CurrentDomain的Id和FriendName,我发现这些AppDomain不一样。
在创建本机窗口期间,CurrentDomain与C#控件的相同,但是当本机窗口接收消息并处理这些消息时,CurrentDomain与C#控件不同。
这种情况可以改变吗?是否可以让本机窗口消息在与C#控件相同的AppDomain中运行?
或许还有其他建议吗?
谢谢, 罗杰
答案 0 :(得分:1)
我确实找到了问题的解决方案。我成功地实现了我的代码,其方式类似于以下帖子中描述的“来自Mirality的思想, 来自Miral在Mirality Systems的随机思考和思考“主题下的博客”AppDomains中的非托管回调“。
祝你好运, 罗杰http://lambert.geek.nz/2007/05/29/unmanaged-appdomain-callback/