3

런타임 차단을 수행하기 위해 DynamicProxy 3.1을 사용하는 응용 프로그램이 있습니다. 조롱을 위해 NSubstitute을 사용하는 테스트 어셈블리가 있습니다. 방금 컨테이너에서 나오는 특정 유형이 제대로 프록시되었다는 것을 주장 할 수 있도록 전체 부트 스트래핑 된 컨테이너 (구조적으로 InterceptWith을 사용하여 차단)에 대한 "통합"테스트를 작성했습니다.NSubstitute를 참조하는 어셈블리에서 DynamicProxy 유형을 사용할 때 "유형이 두 어셈블리 모두에 존재합니다"라는 오류를 수정하는 방법은 무엇입니까?

[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' 

이 충돌이 발생합니까?

답변

2

NSubstitute source code을 잡고 프로젝트 대상에서 ilmerge 명령을 제거 할 수 있습니다. 이 문제를 해결하기 위해 저장소에 issue 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'" /> 
2

당신은 '통근 별칭'지시어를 사용할 수 있습니다 http://blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx

은 기본적으로

(1) VS에서, 조립 FooVersion1에 대한 참조 및 마우스 오른쪽 버튼으로 클릭> 등록 정보로 이동합니다. 에

(2) 변화 '별칭'값 'FooVersion1'

(3) .cs 파일 사용 : HTTP : //www.davidarno

extern alias FooVersion1; 
using foo = FooVersion1::FooVersion1; 
... 
var something = foo.FooClass(); 
+0

이 문서에서는 더 저를 도왔다. org/c-howtos/aliases-overcoming-name-conflicts-part-2-extern-alias / –