2013-02-28 88 views
1

因为我使用Castle's DynamicProxy(特别是“无目标接口代理”)来执行自定义处理方法调用的拦截,所以我有一个内部依赖于Castle.Core.dll的.NET库。由于我的程序集是强命名的,因此我想使用ILMerge将我的所有依赖项合并到一个部署程序集中,将我的依赖项的类型内化,以便不会不必要地将它们公开给我的客户。这是NuGet情况下,如果,如果我的组件强命名的,我有我的包依赖关系设置为具体版本的依赖,或装配名称解析休息尤为重要,因为Castle.Core.dll也强名称。请注意,将我的项目作为强名称程序集发布是我的用户所重视的一项功能,因此不能删除强名称。是否有可能使用ILMerge内化Castle项目的DynamicProxy类?

显然,DynamicProxy需要一些类是公共的正常工作。没问题,我可以排除某些类型被ILMerge内化。但是,当我有一个引用我的库的用户时,还会引用Castle.Core.dll。公共类型现在由两个程序集提供,并且对它们的引用不明确。

如果我不使用ILMerge Castle.Core.dll,航运它旁边我自己组装内化,这可能使我的版本,我的用户的版本之间的版本冲突。如果我使用ILMerge内部化程序集,我不得不排除内部化DynamicProxy需要正常工作的类型。由于模糊的类型,此方法会破坏引用我的程序集和Castle.Core.dll的任何项目。

我是否被迫进入这两个不理想的行动之一?还是有一些我还没有想到的解决方案?

+0

你应该检查出moq存储库。他们内部的Castle.Core for dynamicproxy也... https://github.com/Moq/moq4/tree/dev/Tools – cecilphillip 2013-03-03 02:15:29

+0

感谢您的指针,但我会指出项目正在使用旧版本的城堡项目,他们遭受同样的问题。 – JimEvans 2013-03-03 04:56:20

+0

这是另一个辩论同一问题的项目。也许他们在这里的讨论可能会对你感兴趣https://github.com/FakeItEasy/FakeItEasy/issues/16 – cecilphillip 2013-03-03 13:47:21

回答

0

当你有两个完全合格的类型相同的名字,那么你会遇到模棱两可的问题。这可以使用extern alias解决。

默认情况下,所有引用的程序集属于全球的别名,这就是为什么在生成的代码,你会看到类似global::System.String内。我无法确定如何在ILMerge中使用extern别名,但可以使用它来消除引用的程序集歧义。无论哪种方式,你可以指定你的“内部” Castle.Core.dll被别名为沿“城堡”线的东西,并从中删除全局别名。缺点是你必须修改你的代码才能充分利用这个优势,例如castle::Castle.Core.Interceptor.IInterceptor

这里是一个很好的资源,可显示您的详细信息,包括图像:http://www.davidarno.org/c-howtos/aliases-overcoming-name-conflicts-part-2-extern-alias/


请记住,该二次基准Castle.Core.dll(由他人使用您的组件)可包含相同完全限定类型,但是对于所有帐户,它们仍然是两个明显不同的类,即,通过从第二个程序集中传入Castle.Core.Interceptor.IInterceptor类型,期望castle::Castle.Core.Interceptor.IInterceptor类型的方法不起作用。

相关问题