3

我有一个使用DynamicProxy 3.1 进行运行时拦截的应用程序。我有一个使用NSubstitute进行模拟的测试程序集。我刚刚针对我完全引导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'

无论如何围绕这个冲突?

4

3 回答 3

2

您可以获取 NSubstitute源代码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'" />
于 2012-09-04T17:34:21.583 回答
2

您可以尝试使用别名来引用 NSubstitute 或 DynamicProxy 程序集。

有关详细信息,请参阅MSDN 如何:使用全局命名空间别名(C# 编程指南)

于 2012-09-04T23:55:04.577 回答
2

您可以使用此处解释的“外部别名”指令:http: //blogs.msdn.com/b/ansonh/archive/2006/09/27/774692.aspx

基本上

(1) 在VS中,转到FooVersion1的程序集参考,然后右键单击>属性。

(2) 将“别名”值更改为“FooVersion1”

(3) 在您的 .cs 文件中使用:

extern alias FooVersion1;
using foo = FooVersion1::FooVersion1;
...
var something = foo.FooClass();
于 2014-10-16T14:26:43.160 回答