Share via


Friend Assemblies (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 conjunto 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 requerem acesso a membros em conjuntos 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 do amigo. Isso permite que o assembly AssemblyB acesso a todos os tipos e membros no assembly a que estejam marcados como Friend (Visual Basic) ou internal (C#).

ObservaçãoObservação

Quando você compila um assembly (assembly AssemblyB) que irá acessar tipos internos ou membros internos de outro assembly (assembly 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 em 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#) os tipos e membros. Por exemplo, se o assembly b é um amigo do assembly a e o conjunto de referências de assembly C B, C não tem acesso a Friend (Visual Basic) ou internal (C#) tipos em r.

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 de amigo é passado para o InternalsVisibleToAttribute atributo não pode ser o nome forte do assembly b: não inclua a versão do assembly, cultura, arquitetura ou token 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 Unsigned Friend Assemblies (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 assinado Friend Assemblies (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 a. extensão netmodule), consulte /moduleassemblyname (Visual Basic) e /moduleassemblyname (C#).

Consulte também

Tarefas

Como: Criar Unsigned Friend Assemblies (C# e Visual Basic)

Como: Criar assinado Friend Assemblies (C# e Visual Basic)

Referência

InternalsVisibleToAttribute

StrongNameIdentityPermission

Conceitos

Assemblies e o Cache de Assembly Global (C# e Visual Basic)

Guia de Programação C#

Outros recursos

Guia de programação Visual Basic