3

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'

この紛争の周りにとにかくありますか?

4

3 に答える 3

2

エイリアスを使用して、NSubstitute または DynamicProxy アセンブリを参照してみてください。

詳細については、MSDN の方法: グローバル名前空間エイリアスを使用する (C# プログラミング ガイド)を参照してください。

于 2012-09-04T23:55:04.577 に答える
2

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'" />
于 2012-09-04T17:34:21.583 に答える
2

ここで説明されているように、「extern alias」ディレクティブを使用できます: 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 に答える