我有一个同时依赖Moq
和Castle.Core
的测试,并尝试引用接口Castle.DynamicProxy.IProxyTargetAccessor
问题在于Moq
将Castle.Core
代码嵌入(全部或部分,不确定)内,因此Castle.DynamicProxy.IProxyTargetAccessor
在这两个程序集中都显示为public
。
现在,我正在显式使用Castle.Core
创建一个动态代理(由于可见性范围减小,因此无法使用嵌入在Moq
中的代码),因此该代理实现了Castle.Core
风格的界面。
令人尴尬,但是我不知道如何告诉编译器使用正确的接口,或者根本不可能。
编辑1
但是单击任何选择都不会执行任何操作。可能是Rider的错误,因为它必须使用某种C#语法来显式地针对Castle.Core
程序集。但是不确定它是否存在。
我可以使用反射来重写代码,但是我很好奇它是否具有编译时解决方案。
编辑2
删除对Castle.Core
的引用不起作用:
DynamicProxyFactory.cs(20, 26): [CS0122] 'ProxyGenerator' is inaccessible due to its protection level
DynamicProxyFactory.cs(27, 67): [CS0122] 'IInterceptor' is inaccessible due to its protection level
DynamicProxyFactory.cs(43, 38): [CS0122] 'IInterceptor' is inaccessible due to its protection level
DynamicProxyFactory.cs(91, 31): [CS0122] 'IInvocation' is inaccessible due to its protection level
这是因为Moq
并未真正引用Castle.Core
。相反,它可能是在ilmerge的帮助下嵌入其中的。但是显然,它修改了我要使用的某些接口的可见性范围。因此,使用它们时会出现编译错误。
编辑3
由Reflector提供:
我们可以看到Castle.DynamicProxy.IInterceptor
中的Moq
是internal
。在最新版本的Castle.Core
中是公开的。
答案 0 :(得分:0)
因此,我没有找到如何从程序集中显式引用类型的信息,但是https://stackoverflow.com/users/5101046/scott-hannen的注释使我意识到我可以将Moq
升级到不再嵌入{ {1}},但通常引用它。
那解决了我的障碍。