如何从Castle.Core而不是Moq引用Castle.DynamicProxy.IProxyTargetAccessor?

时间:2019-07-03 14:31:01

标签: c# proxy moq

我有一个同时依赖MoqCastle.Core的测试,并尝试引用接口Castle.DynamicProxy.IProxyTargetAccessor

问题在于MoqCastle.Core代码嵌入(全部或部分,不确定)内​​,因此Castle.DynamicProxy.IProxyTargetAccessor在这两个程序集中都显示为public

现在,我正在显式使用Castle.Core创建一个动态代理(由于可见性范围减小,因此无法使用嵌入在Moq中的代码),因此该代理实现了Castle.Core风格的界面。

令人尴尬,但是我不知道如何告诉编译器使用正确的接口,或者根本不可能。

编辑1

问题是如何在Rider中显现出来的: enter image description here

但是单击任何选择都不会执行任何操作。可能是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提供:

enter image description here

我们可以看到Castle.DynamicProxy.IInterceptor中的Moqinternal。在最新版本的Castle.Core中是公开的。

1 个答案:

答案 0 :(得分:0)

因此,我没有找到如何从程序集中显式引用类型的信息,但是https://stackoverflow.com/users/5101046/scott-hannen的注释使我意识到我可以将Moq升级到不再嵌入{ {1}},但通常引用它。 那解决了我的障碍。