2015-02-09 68 views
2

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

长版本:我们使用AppDomains来管理较大应用程序下的不同子模块。我们希望独立部署这些子模块,因此可以使用AppDomains。我们在主应用程序和子模块之间有一个共享的合同dll,不同版本的合同dll可能会在各个子模块中结束,因为每个子模块的更新频率都比主应用程序更少。因此,有时会在合约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); 

感谢您对此的帮助。

回答

1

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

MAF包含三个概念:

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

通过创建多个接口并实现它们之间的适配器定义外接程序管线。这是一个单调乏味的过程,但它使您可以对接口进行AddIn端以及主机端版本控制。您可以在新主机中使用旧的AddIns,并且可以在旧版主机中使用新的AddIns,因为您部署了适当的适配器。整个过程描述如下over here

Discovery使您的主机应用程序能够枚举它在配置的位置(包括元数据)中找到的所有AddIns。

激活然后使用在发现阶段发现的任何AddInToken来激活AddIn。您可以选择几种隔离模型,包括AppDomains,它们应该很适合您的用例。

我已经多次在不同的项目中使用过该框架。如果您习惯了复杂的流水线开发流程,并且在几个陷阱中绊倒了(总是将“复制本地”设置为AddInsViews引用的false添加到您的AddIns中),那就付出代价。

关于创建示例应用程序的广泛教程,look here

+0

谢谢弗兰克。这很可能是我们长期的答案,我想我可以解决我们目前的问题,因为我们现在只有1个子模块。 – 2015-02-09 17:42:38