简短版本:我试图在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);
感谢您的帮助。
答案 0 :(得分:1)
有一个框架可以准确地完成您的工作。它位于基类库中,名为 MAF (Managed AddIn Framework) ,您可以通过引用System.AddIn.dll
来使用它。
MAF由三个概念组成:
通过创建多个接口并在它们之间实现适配器来定义 AddIn管道。这是一个繁琐的过程,但它使您可以同时执行接口的AddIn端和主机端版本控制。您可以在新主机中使用旧的AddIns,并且可以在较旧版本的主机中使用新的AddIns,前提是您部署了适当的适配器。整个过程描述为over here。
发现使您的主机应用程序能够枚举它在您配置的位置找到的所有AddIns,包括元数据。
激活然后使用在发现阶段找到的任何AddInToken
来激活AddIn。您可以选择几种隔离模型,包括AppDomains,它们非常适合您的用例。
我已经多次在不同的项目中使用过这个框架。如果你习惯了一些复杂的流水线开发过程并且遇到了几个陷阱(总是设置"将本地和#34;复制到false
以便AddIns中的AddInViews引用),它就会付出代价。
有关创建示例应用程序的详尽教程,look here。