Assembleias de amigos
Um assembly friend é um assembly que pode acessar os tipos e membros internos (C#) ou Friend (Visual Basic) de outro assembly. Se você adicionar um atributo assembly a AssemblyA para identificar AssemblyB como um assembly amigo, não será mais necessário marcar tipos e membros em AssemblyA como públicos para que eles sejam acessados por AssemblyB. Isso é especialmente conveniente nos seguintes cenários:
Durante o teste de unidade, quando o código de teste é executado em um assembly separado, mas requer acesso aos membros no assembly que está sendo testado que estão marcados como
internal
em C# ouFriend
no Visual Basic.Quando você está desenvolvendo uma biblioteca de classes e adições à biblioteca estão contidas em assemblies separados, mas exigem acesso a membros em assemblies existentes que são marcados como
internal
em C# ouFriend
no Visual Basic.
Observações
Você pode usar o InternalsVisibleToAttribute atributo para identificar um ou mais assemblies amigos para um determinado assembly. O exemplo a seguir usa o InternalsVisibleToAttribute atributo em AssemblyA e especifica assembly AssemblyB como um assembly amigo. Isso dá ao assembly AssemblyB acesso a todos os tipos e membros no Assembly A marcados como internal
em C# ou Friend
no Visual Basic.
Nota
Quando você compila um assembly como AssemblyB que acessará tipos internos ou membros internos de outro assembly como AssemblyA, você deve especificar explicitamente o nome do arquivo de saída (.exe ou .dll) usando a opção de compilador -out . Isso é necessário porque o compilador ainda não gerou o nome para o assembly que está construindo no momento em que está vinculando a referências externas. Para obter mais informações, consulte OutputAssembly (C#) ou -out (Visual Basic).
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");
}
}
Imports System.Runtime.CompilerServices
<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
Somente assemblies que você especificar explicitamente como amigos podem acessar internal
tipos e membros (C#) ou Friend
(Visual Basic). Por exemplo, se AssemblyB é amigo do Assembly A e Assembly C faz referência a AssemblyB, Assembly C não tem acesso a internal
tipos (C#) ou Friend
(Visual Basic) no Assembly A.
O compilador executa alguma validação básica do nome do assembly amigo passado para o InternalsVisibleToAttribute atributo. Se o Assembly A declarar AssemblyB como um assembly amigo, as regras de validação serão as seguintes:
Se Assembly A é strong named, AssemblyB também deve ser strong named. O nome do assembly amigo que é passado para o atributo deve consistir no nome do assembly e na chave pública da chave strong-name usada para assinar AssemblyB.
O nome do assembly amigo que é passado para o InternalsVisibleToAttribute atributo não pode ser o nome forte de AssemblyB. Não inclua a versão do assembly, a cultura, a arquitetura ou o token de chave pública.
Se o assembly A não tiver um nome forte, o nome do assembly amigo deverá consistir apenas no nome do assembly. Para obter mais informações, consulte Como criar assemblies de amigos não assinados.
Se AssemblyB for strong named, você deverá especificar a chave strong-name para AssemblyB usando a configuração do projeto ou a opção de compilador de linha
/keyfile
de comando. Para obter mais informações, consulte Como criar assemblies de amigos assinados.
A StrongNameIdentityPermission classe também fornece a capacidade de compartilhar tipos, com as seguintes diferenças:
StrongNameIdentityPermission aplica-se a um tipo individual, enquanto uma montagem amiga se aplica a toda a montagem.
Se houver centenas de tipos no Assembly A que você deseja compartilhar com o AssemblyB, você terá que adicionar StrongNameIdentityPermission a todos eles. Se você usar uma assembleia de amigos, você só precisa declarar a relação de amizade uma vez.
Se utilizar StrongNameIdentityPermissiono , os tipos que pretende partilhar têm de ser declarados como públicos. Se você usar um assembly amigo, os tipos compartilhados serão declarados como
internal
(C#) ouFriend
(Visual Basic).
Para obter informações sobre como acessar os internal
tipos e métodos de um assembly (C#) ou Friend
(Visual Basic) a partir de um arquivo de módulo (um arquivo com a extensão .netmodule ), consulte ModuleAssemblyName (C#) ou -moduleassemblyname (Visual Basic).