控制台和 WPF 应用程序有什么区别吗? (跨AppDomain的事件)

发布于 2024-08-04 22:17:30 字数 743 浏览 5 评论 0原文

我构建了一些程序集,其中之一是提供一些功能和一些事件。一些关系如下:

  • Assembly A 是一个接口门面组件,它声明了所有服务接口。
  • 程序集 B 是程序集 A 声明的所有接口的“模拟”实现(包括事件)
  • 程序集 C 是程序集 A 声明的所有接口的“真实”实现(包括事件)

并且 B 将负责在第二个 AppDomain 中创建 C 并调用方法在C中,如下所示: 在 B 程序集内部:

void MethodA()
{
...
AppDomain proxyAppDomain = AppDomain.CreateDomain(..)
ProxyGenerator proxyGenerator = (ProxyGenerator)proxyAppDomain.CreateInstanceAndUnwrap(...)
proxyGenerator.UpdateProgressEvent += OnUpdatePregress(..);
proxyGenerator.MethodA();
}

并且,调用者应用程序将与程序集 B 交互,而不是直接与 C 交互。

现在,如果调用者应用程序是 Console 类型,则一切正常,但如果调用者应用程序是 WPF 类型,则失败并报告“SampleForm.Window1 in ... 未标记为可序列化”(SampleForm.Window1 是 WPF 主窗口)。

我自己也很困惑,谁能帮我解决这个问题?

谢谢, 肯特

I built some assemblies, one of them is to provide some functionalities and some events. some relationship as below:

  • Assembly A is one interface facade component, it declares all service interfaces.
  • Assembly B is one "Mock" implementation of all interfaces declared Assembly A (include event)
  • Assembly C is one "Real" implementation of all interfaces declared Assembly A (include event)

And B will be responsible for creating C in second AppDomain and invoke methods in C, like below:
Inside B assembly:

void MethodA()
{
...
AppDomain proxyAppDomain = AppDomain.CreateDomain(..)
ProxyGenerator proxyGenerator = (ProxyGenerator)proxyAppDomain.CreateInstanceAndUnwrap(...)
proxyGenerator.UpdateProgressEvent += OnUpdatePregress(..);
proxyGenerator.MethodA();
}

And, caller application will interact with Assembly B, rather than C directly.

Now, if caller application is Console type, everything works well, but if caller application is WPF type, it failed and reported that "SampleForm.Window1 in ... is not marked as Serializable" (SampleForm.Window1 is WPF main window).

It confused myself, who can help me on this?

Thanks,
Kent

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

↘人皮目录ツ 2024-08-11 22:17:30

显然您正在跨越应用程序域边界。所有跨此的类型都必须在发送之前进行序列化,然后在另一个应用程序域中进行反序列化。因此,跨应用程序域的类型必须是可序列化的。

您可能应该以不交叉发送的方式更改代码。

看看: net-problem-with-raise-and-handling -使用应用程序域的事件

Apparently you are crossing app domain boundaries. All types that cross this must be serialized before sent and then deserialized in another app domain. Therefore types that cross app domains must be serializable.

You should probably change the code in a way that form in not sent cross.

Look at: net-problem-with-raising-and-handling-events-using-appdomains

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文