Как исправить ошибку "тип существует в обеих сборках" при использовании типов 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="&quot;$(MSBuildProjectDirectory)\..\..\ThirdParty\Ilmerge\ILMerge.exe&quot; /internalize:&quot;$(MSBuildProjectDirectory)\ilmerge.exclude&quot; /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly)  &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" Condition=" '$(TargetFrameworkVersion)' == 'v3.5'" />
<exec command="&quot;$(MSBuildProjectDirectory)\..\..\ThirdParty\Ilmerge\ILMerge.exe&quot; /internalize:&quot;$(MSBuildProjectDirectory)\ilmerge.exclude&quot; /keyfile:$(AssemblyOriginatorKeyFile) /out:@(MainAssembly) /targetplatform:&quot;v4,$(FrameworkReferenceAssemblyPath).&quot; &quot;@(IntermediateAssembly)&quot; @(AssembliesToMerge->'&quot;%(FullPath)&quot;', ' ')" 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();
Другие вопросы по тегам