gpt4 book ai didi

c# - 创建应用程序域以与插件一起使用 : "Type in assembly is not marked as serializable

转载 作者:太空狗 更新时间:2023-10-29 21:13:09 27 4
gpt4 key购买 nike

我正在尝试启用在我的 WPF 应用程序中使用插件的功能。就我的理解而言,我需要(嗯,不需要,但建议)创建一个额外的应用程序域。

为此,我在我的 App.xaml.cs 中启动时执行以下操作:

    private void LoadPlugins()
{
// Create and polish plugin app domain
AppDomain pluginAppDomain = AppDomain.CreateDomain("MyProject Plugin Container", null);
pluginAppDomain.UnhandledException += PluginAppDomain_UnhandledException;

//TODO: Load plugins from dlls
}

private void PluginAppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Logger.FatalException("PluginAppDomain", e.ExceptionObject as Exception);
}

但是附加 UnhandledException 事件失败并出现异常:

Type 'MyProject.App' in assembly 'MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1337' is not marked as serializable.

可能是什么问题?

最佳答案

.NET Remoting 需要从子 AppDomain 访问 PluginAppDomain_UnhandledExceptionPluginAppDomain_UnhandledException 是一个实例方法,因此子 AppDomain 需要通过该类的当前对象 (this) 访问它。有两种方法可以做到这一点。一种是让类派生自 MarshalByRefObject这将允许通过代理从其他 AppDomains 访问它的实例。另一种方式是用 SerializableAttribute 装饰类并让 .NET Remoting 知道此类的实例可以序列化到其他 AppDomain。这就是您收到可序列化错误的原因。您的类未 1) 从 MarshalByRefObject 派生并且 2) 未标记为 Serializable

据我所知,从不同的 AppDomain 订阅这个事件并不是一个好主意。你看,即使你让这个类和 Logger 的类派生自 MarshalByRefObject 你仍然离一个好的解决方案还有很长的路要走,因为你在 AppDomains 之间传递异常.因此,要使其正常工作,您需要在 AppDomain 之间传递的所有异常是可序列化,并且它们的程序集会加载到两个 AppDomain 中。如果您想隔离插件,这可能是个问题。

如果我是你,我会首先让我的应用程序支持插件,而不用处理单独的 AppDomain。关于 AppDomains 和 UnhandleExceptions 的整件事相当复杂。

然后我可能会尝试你的方法,但是使用 MarshalByRefObject 派生对象(如果 PluginAppDomain_UnhandledException 是静态的,只有 Logger 就足够了)并且只将字符串传递给 Logger 的方法。

否则我只会给插件一个单独的日志或使用 Windows 事件日志。

关于c# - 创建应用程序域以与插件一起使用 : "Type in assembly is not marked as serializable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19221678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com