Elemar DEV

Tecnologia e desenvolvimento

Isole “InternalsVisibleTo” em um arquivo

Olá. Tudo certo?

Você conhece o atributo de assembly InternalsVisibleTo? Ele faz com que classes/métodos/propriedades marcados como internal sejam “vistos” nos assemblies que indicados. É um recurso importante utilizado com frequência quando precisamos escrever, por exemplo, testes de unidade para esses membros.

Inicialmente, costumava adicionar esse atributo no arquivo AssemblyInfo.cs. Entretanto, inspecionando o código fonte de alguns projetos open source, percebi que é comum criar um arquivo “InternalsVisibleTo.cs” para este fim.

Abaixo. reprodução parcial desse arquivo no fonte do Rx (encurtei os nomes dos assemblies intencionalmente).

// Copyright (c) Microsoft Open Technologies, Inc.
// All rights reserved. See License.txt in the project root for license information.

using System;

#if SIGNED

#if SIGNENHANCED // Key 272 for .NET 4.5 and beyond
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Linq, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices, [..]")]
#else            // Key 35 for older platforms
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Linq, [..]")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices, [..]")]
#endif

#else

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Debugger")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Experimental")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.Linq")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Reactive.PlatformServices")]

#endif

Perceba que o time do Rx utiliza “InternalsVisibleTo” com outras finalidades além de facilitar testes.

Agora, o mesmo conceito aplicado no projeto do EntityFramework (novamente, encurtei os nomes dos assemblies).

// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.

#if !INTERNALS_INVISIBLE

using System.Runtime.CompilerServices;

[assembly:
    InternalsVisibleTo(
        "EntityFramework.UnitTests, [..]")]
[assembly:
    InternalsVisibleTo(
        "EntityFramework.FunctionalTests.Transitional, [..]")]

// for Moq

[assembly:
    InternalsVisibleTo(
        "DynamicProxyGenAssembly2, [..]"
        )]

#endif

O que você acha?

Era isso.

6 comentários em “Isole “InternalsVisibleTo” em um arquivo

  1. Alberto Chvaicer
    13/03/2013

    Perfeito!
    Procurava por essa solução hà tempos.

    Cheguei a criar testes no mesmo assembly por não saber isso!

  2. O que acha de separar o arquivo?

    Cara se for isso não vi benefício algum, pode ser limitação minha, mas não vi razão para tirar do AssemblyInfo.

  3. Robson Castilho
    13/03/2013

    No meu caso, como estou expondo apenas para 1 assembly (que é o projeto de testes correspondente ao projeto testado), nunca vi necessidade.
    Fica no AssemblyInfo mesmo! :)

  4. Também costumo manter o uso do atributo InternalsVisibleTo em um arquivo separado. A principal vantagem que tenho com isso é poder compartilhar o arquivo (Add as a link) em diferentes projetos de uma mesma solução. Nesse caso os Internals de todos os projetos onde esse arquivo é adicionado tornam-se visíveis aos assemblies listados (como parâmetro para o atributo).

  5. Thiago Andrade
    10/04/2013

    Onde é definido SIGNENHANCED? (Mostrado no código do artigo)
    Já vem definido no próprio Visual Studio ou temos que definir na mão?

    Solução muito boa.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às 13/03/2013 por em Post e marcado .

Estatísticas

  • 677,487 hits
%d blogueiros gostam disto: