AssemblyName.SetPublicKeyToken(Byte[]) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
设置公钥标记,该标记为应用程序或程序集签名时所用公钥的 SHA-1 哈希值的最后 8 个字节。
public:
void SetPublicKeyToken(cli::array <System::Byte> ^ publicKeyToken);
public void SetPublicKeyToken (byte[] publicKeyToken);
public void SetPublicKeyToken (byte[]? publicKeyToken);
member this.SetPublicKeyToken : byte[] -> unit
Public Sub SetPublicKeyToken (publicKeyToken As Byte())
参数
- publicKeyToken
- Byte[]
字节数组,包含程序集的公钥标记。
示例
以下示例发出一个动态程序集,并将其保存到当前目录。 创建程序集时, SetPublicKeyToken 方法用于设置程序集的公钥令牌。 然后, GetPublicKeyToken 方法用于检索显示到控制台的公钥令牌。
using namespace System;
using namespace System::Reflection;
using namespace System::Threading;
using namespace System::IO;
using namespace System::Globalization;
using namespace System::Reflection::Emit;
using namespace System::Configuration::Assemblies;
using namespace System::Text;
static void MakeAssembly( AssemblyName^ myAssemblyName, String^ fileName )
{
// Get the assembly builder from the application domain associated with the current thread.
AssemblyBuilder^ myAssemblyBuilder = Thread::GetDomain()->DefineDynamicAssembly( myAssemblyName, AssemblyBuilderAccess::RunAndSave );
// Create a dynamic module in the assembly.
ModuleBuilder^ myModuleBuilder = myAssemblyBuilder->DefineDynamicModule( "MyModule", fileName );
// Create a type in the module.
TypeBuilder^ myTypeBuilder = myModuleBuilder->DefineType( "MyType" );
// Create a method called 'Main'.
MethodBuilder^ myMethodBuilder = myTypeBuilder->DefineMethod( "Main", static_cast<MethodAttributes>(MethodAttributes::Public | MethodAttributes::HideBySig | MethodAttributes::Static), void::typeid, nullptr );
// Get the Intermediate Language generator for the method.
ILGenerator^ myILGenerator = myMethodBuilder->GetILGenerator();
// Use the utility method to generate the IL instructions that print a String* to the console.
myILGenerator->EmitWriteLine( "Hello World!" );
// Generate the 'ret' IL instruction.
myILGenerator->Emit( OpCodes::Ret );
// End the creation of the type.
myTypeBuilder->CreateType();
// Set the method with name 'Main' as the entry point in the assembly.
myAssemblyBuilder->SetEntryPoint( myMethodBuilder );
myAssemblyBuilder->Save( fileName );
}
int main()
{
// Create a dynamic assembly with name 'MyAssembly' and build version '1.0.0.2001'.
AssemblyName^ myAssemblyName = gcnew AssemblyName;
// Set the codebase to the physical directory were the assembly resides.
myAssemblyName->CodeBase = Directory::GetCurrentDirectory();
// Set the culture information of the assembly to 'English-American'.
myAssemblyName->CultureInfo = gcnew CultureInfo( "en-US" );
// Set the hash algorithm to 'SHA256'.
myAssemblyName->HashAlgorithm = AssemblyHashAlgorithm::SHA256;
myAssemblyName->VersionCompatibility = AssemblyVersionCompatibility::SameProcess;
myAssemblyName->Flags = AssemblyNameFlags::PublicKey;
// Get the whole contents of the 'PublicKey.snk' into a Byte array.
FileStream^ publicKeyStream = File::Open( "PublicKey.snk", FileMode::Open );
array<Byte>^publicKey = gcnew array<Byte>(publicKeyStream->Length);
publicKeyStream->Read( publicKey, 0, (int)publicKeyStream->Length );
// Provide the assembly with a public key.
myAssemblyName->SetPublicKey( publicKey );
// Get the whole contents of the 'PublicKeyToken.snk' into a Byte array.
FileStream^ publicKeyTokenStream = File::Open( "PublicKeyToken.snk", FileMode::Open );
array<Byte>^publicKeyToken = gcnew array<Byte>(publicKeyTokenStream->Length);
publicKeyTokenStream->Read( publicKeyToken, 0, (int)publicKeyToken->Length );
// Provide the assembly with a public key token.
myAssemblyName->SetPublicKeyToken( publicKeyToken );
myAssemblyName->Name = "MyAssembly";
myAssemblyName->Version = gcnew Version( "1.0.0.2001" );
MakeAssembly( myAssemblyName, "MyAssembly.exe" );
// Get the assemblies loaded in the current application domain.
array<Assembly^>^myAssemblies = Thread::GetDomain()->GetAssemblies();
// Get the dynamic assembly named 'MyAssembly'.
Assembly^ myAssembly = nullptr;
for ( int i = 0; i < myAssemblies->Length; i++ )
if ( String::Compare( myAssemblies[ i ]->GetName()->Name, "MyAssembly" ) == 0 )
myAssembly = myAssemblies[ i ];
// Display the full assembly information to the console.
if ( myAssembly != nullptr )
{
Console::WriteLine( "\nDisplaying the full assembly name\n" );
String^ assemblyName = myAssembly->GetName()->FullName;
Console::WriteLine( assemblyName );
Console::WriteLine( "\nDisplaying the public key for the assembly\n" );
array<Byte>^publicKeyBytes = myAssembly->GetName()->GetPublicKey();
Console::WriteLine( Encoding::ASCII->GetString( publicKeyBytes ) );
Console::WriteLine( "\nDisplaying the public key token for the assembly\n" );
array<Byte>^publicKeyTokenBytes = myAssembly->GetName()->GetPublicKeyToken();
Console::WriteLine( Encoding::ASCII->GetString( publicKeyTokenBytes ) );
}
}
using System;
using System.Reflection;
using System.Threading;
using System.IO;
using System.Globalization;
using System.Reflection.Emit;
using System.Configuration.Assemblies;
using System.Text;
public class AssemblyName_CodeBase
{
public static void MakeAssembly(AssemblyName myAssemblyName, string fileName)
{
// Get the assembly builder from the application domain associated with the current thread.
AssemblyBuilder myAssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave);
// Create a dynamic module in the assembly.
ModuleBuilder myModuleBuilder = myAssemblyBuilder.DefineDynamicModule("MyModule", fileName);
// Create a type in the module.
TypeBuilder myTypeBuilder = myModuleBuilder.DefineType("MyType");
// Create a method called 'Main'.
MethodBuilder myMethodBuilder = myTypeBuilder.DefineMethod("Main", MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.Static, typeof(void), null);
// Get the Intermediate Language generator for the method.
ILGenerator myILGenerator = myMethodBuilder.GetILGenerator();
// Use the utility method to generate the IL instructions that print a string to the console.
myILGenerator.EmitWriteLine("Hello World!");
// Generate the 'ret' IL instruction.
myILGenerator.Emit(OpCodes.Ret);
// End the creation of the type.
myTypeBuilder.CreateType();
// Set the method with name 'Main' as the entry point in the assembly.
myAssemblyBuilder.SetEntryPoint(myMethodBuilder);
myAssemblyBuilder.Save(fileName);
}
public static void Main()
{
// Create a dynamic assembly with name 'MyAssembly' and build version '1.0.0.2001'.
AssemblyName myAssemblyName = new AssemblyName();
// Set the codebase to the physical directory were the assembly resides.
myAssemblyName.CodeBase = Directory.GetCurrentDirectory();
// Set the culture information of the assembly to 'English-American'.
myAssemblyName.CultureInfo = new CultureInfo("en-US");
// Set the hash algorithm to 'SHA256'.
myAssemblyName.HashAlgorithm = AssemblyHashAlgorithm.SHA256;
myAssemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameProcess;
myAssemblyName.Flags = AssemblyNameFlags.PublicKey;
// Get the whole contents of the 'PublicKey.snk' into a byte array.
FileStream publicKeyStream = File.Open("PublicKey.snk", FileMode.Open);
byte[] publicKey = new byte[publicKeyStream.Length];
publicKeyStream.Read(publicKey, 0, (int)publicKeyStream.Length);
// Provide the assembly with a public key.
myAssemblyName.SetPublicKey(publicKey);
// Get the whole contents of the 'PublicKeyToken.snk' into a byte array.
FileStream publicKeyTokenStream = File.Open("PublicKeyToken.snk", FileMode.Open);
byte[] publicKeyToken = new Byte[publicKeyTokenStream.Length];
publicKeyTokenStream.Read(publicKeyToken, 0, (int)publicKeyToken.Length);
// Provide the assembly with a public key token.
myAssemblyName.SetPublicKeyToken(publicKeyToken);
myAssemblyName.Name = "MyAssembly";
myAssemblyName.Version = new Version("1.0.0.2001");
MakeAssembly(myAssemblyName, "MyAssembly.exe");
// Get the assemblies loaded in the current application domain.
Assembly[] myAssemblies = Thread.GetDomain().GetAssemblies();
// Get the dynamic assembly named 'MyAssembly'.
Assembly myAssembly = null;
for(int i = 0; i < myAssemblies.Length; i++)
if(String.Compare(myAssemblies[i].GetName().Name, "MyAssembly") == 0)
myAssembly = myAssemblies[i];
// Display the full assembly information to the console.
if(myAssembly != null)
{
Console.WriteLine("\nDisplaying the full assembly name\n");
string assemblyName = myAssembly.GetName().FullName;
Console.WriteLine(assemblyName);
Console.WriteLine("\nDisplaying the public key for the assembly\n");
byte[] publicKeyBytes = myAssembly.GetName().GetPublicKey();
Console.WriteLine(Encoding.ASCII.GetString(publicKeyBytes));
Console.WriteLine("\nDisplaying the public key token for the assembly\n");
byte[] publicKeyTokenBytes = myAssembly.GetName().GetPublicKeyToken();
Console.WriteLine(Encoding.ASCII.GetString(publicKeyTokenBytes));
}
}
}
Imports System.Reflection
Imports System.Threading
Imports System.IO
Imports System.Globalization
Imports System.Reflection.Emit
Imports System.Configuration.Assemblies
Imports System.Text
Public Class AssemblyName_CodeBase
Public Shared Sub MakeAssembly(myAssemblyName As AssemblyName, fileName As String)
' Get the assembly builder from the application domain associated with the current thread.
Dim myAssemblyBuilder As AssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(myAssemblyName, AssemblyBuilderAccess.RunAndSave)
' Create a dynamic module in the assembly.
Dim myModuleBuilder As ModuleBuilder = myAssemblyBuilder.DefineDynamicModule("MyModule", fileName)
' Create a type in the module.
Dim myTypeBuilder As TypeBuilder = myModuleBuilder.DefineType("MyType")
' Create a method called 'Main'.
Dim myMethodBuilder As MethodBuilder = myTypeBuilder.DefineMethod("Main", MethodAttributes.Public Or MethodAttributes.HideBySig Or MethodAttributes.Static, GetType(object), Nothing)
' Get the Intermediate Language generator for the method.
Dim myILGenerator As ILGenerator = myMethodBuilder.GetILGenerator()
' Use the utility method to generate the IL instructions that print a string to the console.
myILGenerator.EmitWriteLine("Hello World!")
' Generate the 'ret' IL instruction.
myILGenerator.Emit(OpCodes.Ret)
' End the creation of the type.
myTypeBuilder.CreateType()
' Set the method with name 'Main' as the entry point in the assembly.
myAssemblyBuilder.SetEntryPoint(myMethodBuilder)
myAssemblyBuilder.Save(fileName)
End Sub
Public Shared Sub Main()
' Create a dynamic assembly with name 'MyAssembly' and build version '1.0.0.2001'.
Dim myAssemblyName As New AssemblyName()
' Set the codebase to the physical directory were the assembly resides.
myAssemblyName.CodeBase = Directory.GetCurrentDirectory()
' Set the culture information of the assembly to 'English-American'.
myAssemblyName.CultureInfo = New CultureInfo("en-US")
' Set the hash algorithm to 'SHA256'.
myAssemblyName.HashAlgorithm = AssemblyHashAlgorithm.SHA256
myAssemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameProcess
myAssemblyName.Flags = AssemblyNameFlags.PublicKey
' Get the whole contents of the 'PublicKey.snk' into a byte array.
Dim publicKeyStream As FileStream = File.Open("PublicKey.snk", FileMode.Open)
Dim publicKey(publicKeyStream.Length - 1) As Byte
publicKeyStream.Read(publicKey, 0, CInt(publicKeyStream.Length))
' Provide the assembly with a public key.
myAssemblyName.SetPublicKey(publicKey)
' Get the whole contents of the 'PublicKeyToken.snk' into a byte array.
Dim publicKeyTokenStream As FileStream = File.Open("PublicKeyToken.snk", FileMode.Open)
Dim publicKeyToken() As Byte = New [Byte](publicKeyTokenStream.Length) {}
publicKeyTokenStream.Read(publicKeyToken, 0, CInt(publicKeyToken.Length))
' Provide the assembly with a public key token.
myAssemblyName.SetPublicKeyToken(publicKeyToken)
myAssemblyName.Name = "MyAssembly"
myAssemblyName.Version = New Version("1.0.0.2001")
MakeAssembly(myAssemblyName, "MyAssembly.exe")
' Get the assemblies loaded in the current application domain.
Dim myAssemblies As [Assembly]() = Thread.GetDomain().GetAssemblies()
' Get the dynamic assembly named 'MyAssembly'.
Dim myAssembly As [Assembly] = Nothing
Dim i As Integer
For i = 0 To myAssemblies.Length - 1
If [String].Compare(myAssemblies(i).GetName().Name, "MyAssembly") = 0 Then
myAssembly = myAssemblies(i)
End If
Next i ' Display the full assembly information to the console.
If Not (myAssembly Is Nothing) Then
Console.WriteLine(ControlChars.Cr + "Displaying the full assembly name" + ControlChars.Cr)
Dim assemblyName As String = myAssembly.GetName().FullName
Console.WriteLine(assemblyName)
Console.WriteLine(ControlChars.Cr + "Displaying the public key for the assembly" + ControlChars.Cr)
Dim publicKeyBytes As Byte() = myAssembly.GetName().GetPublicKey()
Console.WriteLine(Encoding.ASCII.GetString(publicKeyBytes))
Console.WriteLine(ControlChars.Cr + "Displaying the public key token for the assembly" + ControlChars.Cr)
Dim publicKeyTokenBytes As Byte() = myAssembly.GetName().GetPublicKeyToken()
Console.WriteLine(Encoding.ASCII.GetString(publicKeyTokenBytes))
End If
End Sub
End Class
注解
通过调用 SetPublicKey 方法设置公钥时,还必须使用 SetPublicKeyToken 方法提供公钥令牌。 否则, SecurityException 在调用 方法时 GetPublicKey 引发 。