2011-07-27 61 views
1

我有一个api MyApi,它被应用程序MyApplication使用。.NET程序集绑定

MyApi有针对性的.NET 4.0客户端配置文件的几个dll文件。例如:

  • MyApi.Core
  • MyApi.Domain
  • MyApi.Providers

(和一些更多)

用于部署简单起见,这些被ILMerged成

  • MyApi.ClientProfile

所有MyApis的DLL强命名。

MyApplication中的所有项目引用MyApi.ClientProfile。

我现在将一些网页功能添加到MyApi中,所以我添加了一个dll MyApi.Web,它是针对.NET 4.0 Extended Profile的。 MyApi.Web引用MyApi.Core和MyApi.Domain(以及System.Web dll)。

现在有也MyApplication.Web项目。它引用了MyApplication中的一些其他项目(它们引用了MyApi.ClientProfile dll)。 MyApplication.Web项目需要引用MyApi.Web dll。

我该怎么做?

如果我从MyApplication.Web添加对MyApi.Core和MyApi.Domain的引用,那么MyApplication.Web的多个程序集中将存在类型。

如果我没有从MyApplication.Web中添加对MyApi.Core和MyApi.Domain的引用,MyApi.Web将无法加载,因为它找不到MyApi.Core或MyApi.Domain(因为只有MyApi.ClientProfile存在)。

我无法处理程序集解析事件并将MyApi.Core/MyApi.Domain的请求重定向到MyApi.ClientProfile,因为MyApi程序集都是强命名的,并且会使其失败。

我无法将MyApi.Web合并到MyApi.ClientProfile中,因为MyApi.ClientProfile应该支持.NET 4.0 Client Profile(并且MyApi.Web引用了System.Web等)。

如果我将MyApi.Web更改为引用MyApi.ClientProfile,它应该适用于这种情况,但并不理想,因为它不会为另一个应用程序直接引用MyApi.Core和MyApi.Domain而工作。

我不想强制MyApplication.Web在其配置中指定bypassTrustedAppStrongNames(认为直接从MyApi.Web启用此设置可能是一个可接受的选项....)。

因此,我一直在想这个问题的合适/优雅的解决方案。

有什么建议吗?

谢谢。

回答

0

我看破了:

如果你的组件具有相同的公钥标记,你可以做重定向和名称并不重要。因此,因为MyApi.Client配置文件使用与MyApi.Core相同的密钥进行签名,所以如果我在MyApi.Web中处理AssemblyResolve,我实际上可以告诉它使用MyApi.ClientProfile而不是MyApi.Core。

我原以为会输出一个强名称验证错误。它不......因为公钥是相同的。