Share via


Assemblies amigáveis (C# e Visual Basic)

A o assembly de amigo é um assembly que pode acessar outro assembly amigo (Visual Basic) ou interno (C#) de tipos e membros. Se você identificar um assembly como um assembly autorizado, você não precisará mais marcar tipos e membros como público na ordem para que eles sejam acessados por outros assemblies. Isso é conveniente principalmente nas seguintes situações:

  • Durante o teste de unidade, quando o código de teste é executado em um assembly separado, mas requer acesso a membros no assembly que está sendo testado marcadas como Friend (Visual Basic) ou internal (C#).

  • Quando você estiver desenvolvendo uma biblioteca de classes e adições à biblioteca estão contidas em conjuntos separados, mas necessitam de acesso a membros em assemblies existentes que são marcados como Friend (Visual Basic) ou internal (C#).

Comentários

Você pode usar o atributo InternalsVisibleToAttribute para identificar um ou mais assemblies autorizados para um determinado assembly. O exemplo a seguir usa a InternalsVisibleToAttribute de atributo no assembly a e especifica o assembly AssemblyB como um assembly de amigo. Isso permite que o assembly AssemblyB o acesso a todos os tipos e membros no assembly a que estão marcados como Friend (Visual Basic) ou internal (C#).

Dica

Quando você compila um assembly (assembly AssemblyB) que irá acessar tipos internos ou membros internos de outro assembly (conjunto a), você deve especificar explicitamente o nome do arquivo de saída (. exe ou. dll), usando o /out opção de compilador.Isso é necessário porque o compilador não gerou ainda o nome do assembly que for criado no momento que ele está ligado referências externas.Para obter mais informações, consulte /out (C#) e /out (Visual Basic).

Imports System.Runtime.CompilerServices
Imports System
<Assembly: InternalsVisibleTo("AssemblyB")> 

' Friend class. 
Friend Class FriendClass
    Public Sub Test()
        Console.WriteLine("Sample Class")
    End Sub 
End Class 

' Public class with a Friend method. 
Public Class ClassWithFriendMethod
    Friend Sub Test()
        Console.WriteLine("Sample Method")
    End Sub 
End Class
using System.Runtime.CompilerServices;
using System;

[assembly: InternalsVisibleTo("AssemblyB")]

// The class is internal by default. 
class FriendClass
{
    public void Test()
    {
        Console.WriteLine("Sample Class");
    }
}

// Public class that has an internal method. 
public class ClassWithFriendMethod
{
    internal void Test()
    {
        Console.WriteLine("Sample Method");
    }

}

Somente os assemblies que você especificar explicitamente como amigos podem acessar Friend (Visual Basic) ou internal (C#) de tipos e membros. Por exemplo, se o assembly b é um amigo de um assembly e o conjunto de referências do assembly C B, C não tem acesso a Friend (Visual Basic) ou internal (C#) os tipos na.

O compilador executa algumas validações básicas do nome do assembly autorizado passado para o atributo InternalsVisibleToAttribute. Se assembly A declara B como uma assembly autorizado, as regras de validação são como a seguir:

  • Se assembly A for nomeado forte, assembly B deve também ser nomeado forte. O nome do assembly autorizado que é passado ao atributo deve consistir do nome do assembly e da chave pública da chave do nome forte que é usada para sinalizar assembly B .

    O nome do assembly autorizado que é passado para o atributo InternalsVisibleToAttribute não pode ser o nome forte do assembly B : Não inclua o no assembly versão, cultura, arquitetura ou símbolo de chave pública.

  • Se assembly A não for nomeado forte, o nome do assembly autorizado deve consistir somente o nome do assembly. Para obter mais informações, consulte Como criar assemblies amigáveis não assinados (C# e Visual Basic).

  • Se assembly B for nomeado forte, especifique a chave de nome fortee para assembly B usando a configuração do projeto ou a linha de comando opção de compilador /keyfile. Para obter mais informações, consulte Como criar assemblies amigáveis assinados (C# e Visual Basic).

O StrongNameIdentityPermission classe também fornece a capacidade de compartilhar tipos, com as seguintes diferenças:

  • StrongNameIdentityPermissionaplica-se a um tipo individual, enquanto um assembly de amigo se aplica ao assembly inteiro.

  • Se existem centenas de tipos no assembly a que você deseja compartilhar com o assembly b, você terá que adicionar StrongNameIdentityPermission a todos eles. Se você usar um assembly de amigo, basta declarar a relação de amigo uma vez.

  • Se você usar StrongNameIdentityPermission, os tipos que você deseja compartilhar precisam ser declarado como público. Se você usar um assembly de amigo, os tipos compartilhados são declarados como Friend (Visual Basic) ou internal (C#).

Para obter informações sobre como acessar um assembly Friend (Visual Basic) ou internal (C#) de tipos e métodos de um arquivo de módulo (um arquivo com o. extensão netmodule), consulte /moduleassemblyname (Visual Basic) e /moduleassemblyname (C#).

Consulte também

Tarefas

Como criar assemblies amigáveis não assinados (C# e Visual Basic)

Como criar assemblies amigáveis assinados (C# e Visual Basic)

Referência

InternalsVisibleToAttribute

StrongNameIdentityPermission

Conceitos

Assemblies e o cache de assemblies global (C# e Visual Basic)

Guia de Programação em C#

Outros recursos

Guia de programação do Visual Basic