InternalsVisibleTo
- InternalsVisibleTo
O elemento <InternalsVisibleTo Include="InternalsVisibleToDemo.Tests" /> é usado no arquivo .csproj de um projeto .NET e está relacionado ao recurso InternalsVisibleTo em C#. Esse recurso permite que tipos e membros internos de um assembly sejam acessíveis por outro assembly.
Contexto do InternalsVisibleTo
Por padrão, membros ou tipos marcados como internal em um assembly só podem ser acessados dentro do mesmo assembly. Contudo, o atributo InternalsVisibleTo permite expor esses membros e tipos internos para outro assembly específico.
Uso no arquivo .csproj
No arquivo .csproj, o elemento <InternalsVisibleTo> é uma maneira moderna e simplificada de configurar essa visibilidade sem precisar adicionar manualmente o atributo [InternalsVisibleTo] no código-fonte.
Exemplo:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="InternalsVisibleToDemo.Tests" />
</ItemGroup>
</Project>
Neste exemplo:
- O projeto atual é configurado para permitir que os tipos e membros
internalsejam acessados pelo assembly chamado InternalsVisibleToDemo.Tests.
Quando usar?
Esse recurso é especialmente útil em cenários como:
- Testes unitários: Você quer testar membros
internalsem torná-los públicos. Com essa configuração, o assembly de teste pode acessar diretamente os membros internos do assembly principal. - Módulos ou plugins internos: Quando um assembly secundário (como um plugin) precisa acessar membros
internaldo assembly principal.
Como funciona no código?
Se você quiser adicionar esse recurso manualmente no código-fonte em vez de usar o arquivo .csproj, pode usar o atributo [InternalsVisibleTo] no arquivo AssemblyInfo.cs.
Exemplo em código:
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("InternalsVisibleToDemo.Tests")]
// deve ser acima do namespace do arquivo
Nesse caso:
- O assembly atual permitirá que o assembly InternalsVisibleToDemo.Tests acesse os seus tipos e membros
internal.
Considerações:
- Segurança: O nome do assembly destinatário deve coincidir exatamente (incluindo maiúsculas e minúsculas). Em casos de assemblies assinados, você precisa especificar a chave pública do assembly destinatário para garantir segurança.
- Boas práticas: Use o
InternalsVisibleToapenas quando necessário, pois expor tipos e membros internos pode comprometer o encapsulamento.
Resumo:
- O elemento
<InternalsVisibleTo Include="InternalsVisibleToDemo.Tests" />no arquivo.csprojpermite que o assembly InternalsVisibleToDemo.Tests acesse membrosinternaldo projeto configurado. - É usado principalmente para testes ou extensibilidade, facilitando o acesso a membros internos sem torná-los públicos.