Como: Usar a assinatura completa para dar um Assembly dinâmico um nome forte

Um assembly dinâmico pode ser fornecido um nome forte usando a assinatura parcial ou completo de assinatura. A chave pública para assinar parcial, deve ser especificada na AssemblyName passado para o DefineDynamicAssembly método. O common language runtime aloca o espaço em que o arquivo de executável portável (PE) para um blob de assinatura de nome forte, mas realmente não assinar o assembly. O assembly resultante pode ser totalmente assinado em uma etapa de pós-processamento usando as ferramentas fornecidas na Windows Software Development Kit (SDK).

Para a assinatura completa, um par de chaves pública/particular deve ser fornecido. Geralmente, essas entidades são armazenadas em um arquivo ou disco ou em um recipiente de chave de propriedade por um Crypto API Cryptographic Service Provider (CSP). Chaves de segurança baixo freqüentemente são geradas por CSPs baseada em software e exportadas para um arquivo, portanto, pode ser verificados em sistemas de gerenciamento de código de origem durante o desenvolvimento do projeto. Chaves de alta segurança são freqüentemente geradas por hardware, que geralmente ajuda a evitar a exportação das chaves por motivos de segurança. Esses pares de chaves só podem ser acessados indiretamente por meio de um recipiente de chave. O par de chaves de nome forte é especificado usando o System.Reflection.StrongNameKeyPair classe.

O exemplo a seguir demonstra o uso de assinatura completa para dar um assembly dinâmico um nome forte.

Exemplo

Imports System
Imports System.IO
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit

Class SNKToAssembly
    Public Shared Sub Main()
        Dim fs As New FileStream("SomeKeyPair.snk", FileMode.Open)
        Dim kp As New StrongNameKeyPair(fs)
        fs.Close()
        Dim an As new AssemblyName()
        an.KeyPair = kp
        Dim appDomain As AppDomain = Thread.GetDomain()
        Dim ab As AssemblyBuilder = _
            appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave)
    End Sub
End Class
' Construct a StrongNameKeyPair object. This object should obtain 
' the public key from the Company.keys file.
Dim k As Reflection.StrongNameKeyPair = _
    New Reflection.StrongNameKeyPair(fs)
using System;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Reflection.Emit;

class SNKToAssembly
{
    public static void Main()
    {
        FileStream fs = new FileStream("SomeKeyPair.snk", FileMode.Open);
        StrongNameKeyPair kp = new StrongNameKeyPair(fs);
        fs.Close();
        AssemblyName an = new AssemblyName();
        an.KeyPair = kp;
        AppDomain appDomain = Thread.GetDomain();
        AssemblyBuilder ab = appDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
    }
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair k = new StrongNameKeyPair(fs);
using namespace System;
using namespace System::IO;
using namespace System::Threading;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

ref class SNKToAssembly
{
public:
    static void Main()
    {
        FileStream^ fs = gcnew FileStream("SomeKeyPair.snk", FileMode::Open);
        StrongNameKeyPair^ kp = gcnew StrongNameKeyPair(fs);
        fs->Close();
        AssemblyName^ an = gcnew AssemblyName();
        an->KeyPair = kp;
        AppDomain^ appDomain = Thread::GetDomain();
        AssemblyBuilder^ ab = appDomain->DefineDynamicAssembly(an, AssemblyBuilderAccess::RunAndSave);
    }
};

int main()
{
   SNKToAssembly::Main();
}
// Construct a StrongNameKeyPair object. This object should obtain
// the public key from the Company.keys file.
StrongNameKeyPair^ k = gcnew StrongNameKeyPair(fs);

Consulte também

Conceitos

Assemblies de nomes fortes

Criando e usando Assemblies de Nome Forte

Outros recursos

Usando a reflexão emitir.