c# - 跨 AppDomain 的自定义序列化

标签 c# serialization appdomain binaryformatter appdomainsetup

简短版本:我正在尝试跨 AppDomain 边界自定义序列化,特别是处理 AppDomain 两侧的类版本略有不同的情况。我该怎么做?

长版本:我们使用 AppDomains 来管理较大应用程序下的不同子模块。我们希望独立部署这些子模块,因此使用 AppDomains。我们在主应用程序和子模块之间有一个共享的契约(Contract) dll,不同版本的契约(Contract) dll 可能最终出现在各个子模块中,因为每个子模块的更新频率都低于主应用程序。因此,有时会在合约 dll 中添加新字段或新类型,并在主应用程序中使用,但子模块不知道如何序列化它。

我认为我可以通过自定义序列化过程(特别是 SerializationBinder.BindToType)来解决此问题。然而要做到这一点,我需要告诉 AppDomain 的每一方使用这个序列化绑定(bind)器。我该怎么做呢?我在网上看到的所有示例都显式调用了 Serialize() 和 Deserialize()。我初始化 AppDomain 的代码是:

var appDomainSetup = new AppDomainSetup
{
    ApplicationBase = config.BasePath,
    ShadowCopyFiles = "true",
    ConfigurationFile = File.Exists(configPath) ? configPath : null,
};

AppDomain.CreateDomain("myappdomain", null, appDomainSetup);

感谢您对此的帮助。

最佳答案

有一个框架正是您想要做的事情。它位于基类库中,名为 MAF (Managed AddIn Framework) ,您可以通过引用System.AddIn.dll来使用它。

MAF 包含三个概念:

  1. 管道
  2. 发现
  3. 激活

您可以通过创建多个接口(interface)并在它们之间实现适配器来定义AddIn 管道。这是一个乏味的过程,但它使您能够对接口(interface)进行插件端和主机端版本控制。如果您部署了适当的适配器,您可以在新主机中使用旧的 AddIn,也可以在旧版本的主机中使用新的 AddIn。整个过程描述over here .

发现使您的主机应用程序能够枚举它在您配置的位置中找到的所有插件,包括元数据。

激活然后使用发现阶段发现的任何AddInToken来激活插件。您可以在多种隔离模型之间进行选择,包括 AppDomains,它应该非常适合您的用例。

我已经在不同的项目中多次使用该框架。如果您习惯了有些复杂的管道开发过程并遇到了几个陷阱(对于您的 AddIns 中的 AddInViews 引用,请始终将“Copy Local”设置为 false),这是值得的。

有关创建示例应用程序的详细教程,look here .

关于c# - 跨 AppDomain 的自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28415167/

相关文章:

c# - 使用 TFS 工件时未在单独的 AppDomain 中找到 MEF 导出

c# - .NET 中 yield 和 await 如何实现控制流?

c# - 在 void 方法中使用 return 是不好的做法吗?

c# - Entity Framework 0..1 到 0 的关系

c# - 在 C# 中检查集合内部的类型

c# - 是否有可能导致在另一个应用程序域中创建线程?

java - Jackson 强制序列化最终字段而无需注释

Python/Arduino串口通信

python - 设置django rest框架配置的DatetimeField格式

c# - 从另一个目录加载程序集到临时 Appdomain