Как исправить ошибку "тип существует в обеих сборках" при использовании типов DynamicProxy в сборке, ссылающейся на NSubstitute?
У меня есть приложение, которое использует DynamicProxy 3.1 для выполнения перехвата во время выполнения. У меня есть тестовая сборка, которая использует NSubstitute для насмешки. Я только что написал несколько "интеграционных" тестов для моего полностью загруженного контейнера (StructureMap использует InterceptWith
сделать перехват), чтобы я мог утверждать, что определенные типы, выходящие из контейнера, проксируются правильно.
[Subject(typeof(RobotBoard))]
public class When_resolving_an_intercepted_type : WithContainer<IRobotBoard>
{
It should_have_recovery = () => Subject.ShouldHaveInterceptor<RecoveryInterceptor>();
}
public static class TestExtensions
{
public static void ShouldHaveInterceptor<T>(this object obj)
where T : IInterceptor
{
((IProxyTargetAccessor)obj)
.GetInterceptors()
.ToList()
.Exists(x => x is T)
.ShouldBeTrue();
}
}
Однако, я получаю эту ошибку, указывая, что ссылки DynamicProxy также находятся внутри сборки NSubstitute! (кажется, погружен).
Error 11 MyCompany.MyModule.Specifications D:\code\source\tests\When_resolving_an_intercepted_type.cs
The type 'Castle.DynamicProxy.IProxyTargetAccessor' exists in both 'd:\code\packages\Castle.Core.3.1.0\lib\net40-client\Castle.Core.dll' and 'd:\code\packages\NSubstitute.1.4.2.0\lib\NET40\NSubstitute.dll'
Есть ли что-нибудь вокруг этого конфликта?
3 ответа
Вы можете получить исходный код NSubstitute и удалить ilmerge
команды из целей проекта. Я открыл выпуск 86 в их хранилище, чтобы решить эту проблему.
<exec command=""$(MSBuildProjectDirectory)\..\..\ThirdParty\Ilmerge\ILMerge.exe" /internalize:"$(MSBuildProjectDirectory)\ilmerge.exclude" /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" Condition=" '$(TargetFrameworkVersion)' == 'v3.5'" />
<exec command=""$(MSBuildProjectDirectory)\..\..\ThirdParty\Ilmerge\ILMerge.exe" /internalize:"$(MSBuildProjectDirectory)\ilmerge.exclude" /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) /targetplatform:"v4,$(FrameworkReferenceAssemblyPath)." "@(IntermediateAssembly)" @(AssembliesToMerge->'"%(FullPath)"', ' ')" Condition=" '$(TargetFrameworkVersion)' == 'v4.0'" />
Вы можете попробовать использовать псевдоним для ссылки на сборки NSubstitute или DynamicProxy.
См. MSDN Практическое руководство. Использование псевдонима глобального пространства имен (Руководство по программированию в C#) для получения дополнительной информации.
Вы можете использовать директиву 'extern alias', как описано здесь: http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx
в принципе
(1) в VS перейдите к ссылке на сборку для FooVersion1 и щелкните правой кнопкой мыши> Свойства.
(2) измените значение 'aliases' на 'FooVersion1'
(3) в вашем файле.cs используйте:
extern alias FooVersion1;
using foo = FooVersion1::FooVersion1;
...
var something = foo.FooClass();