У меня есть тест, который зависит от Moq
и Castle.Core
, и я пытаюсь сослаться на интерфейс Castle.DynamicProxy.IProxyTargetAccessor
Проблема в том, что Moq
встраивает Castle.Core
код (полностью или частично, не уверен), и поэтому Castle.DynamicProxy.IProxyTargetAccessor
отображается как public
в обеих этих сборках.
Теперь я создаю динамический прокси, явно используя Castle.Core
(не могу использовать код, встроенный в Moq
из-за ограниченной области видимости), и поэтому прокси реализует интерфейс Castle.Core
интерфейса.
Смущает, но я понятия не имею, как сказать компилятору использовать правильный интерфейс или это вообще возможно.
РЕДАКТИРОВАТЬ 1
Вот как проблема проявляется в Rider:
Но нажатие на любой выбор ничего не делает. Это может быть ошибкой 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
.