2

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

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

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

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

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

感谢您在这方面的帮助。

4

1 回答 1

2

有一个框架可以准确地说明您想要做什么。它在基类库中,叫做MAF (Managed AddIn Framework),你可以通过引用来使用它System.AddIn.dll

MAF由三个概念组成:

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

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

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

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

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

有关创建示例应用程序的详尽教程,请查看此处

于 2015-02-09T17:25:09.403 回答