怎么样取得publickeytoken的值

NOI进阶之路 2006-10-26 10:43:49
今天在搞一个分布式的程序,却遇到一个问题,公钥的使用,找了很多资料都没有找到答案。
希望高手们搭个手,帮忙解决一下。
问题如下:
如何使用程序集的密钥
怎么样取得publickeytoken的值
...全文
2442 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
NOI进阶之路 2006-11-02
  • 打赏
  • 举报
回复
密钥是怎么跟组件产生联系的呢?
一个有多个组件的程序,是否需要很多的密钥呢?
股神 2006-10-28
  • 打赏
  • 举报
回复
up
zCheng 2006-10-27
  • 打赏
  • 举报
回复
不知您遇到了什么问题,能否描述具体一点?比如举个例子说明您面临的问题?

如何使用程序集的密钥?
·您是指如何将程序集签名吗?
A:您可以使用 sn.exe 生成一个密钥文件,然后在项目属性里指定要使用的密钥文件。
·您是指如何通过一个已经签名的程序集的 PublicKeyToken 来导出密钥文件?
A:这个不大可能吧?

·如何取得 PublicKeyToken?
可以参加示例代码:
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 = String.Concat("file:///", Directory.GetCurrentDirectory());
// Set the culture information of the assembly to 'English-American'.
myAssemblyName.CultureInfo = new CultureInfo("en-US");
// Set the hash algoritm to 'SHA1'.
myAssemblyName.HashAlgorithm = AssemblyHashAlgorithm.SHA1;
myAssemblyName.VersionCompatibility = AssemblyVersionCompatibility.SameProcess;
myAssemblyName.Flags = AssemblyNameFlags.PublicKey;
// Provide this assembly with a strong name.
myAssemblyName.KeyPair = new StrongNameKeyPair(File.Open("KeyPair.snk", FileMode.Open, FileAccess.Read));
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");
Console.WriteLine(myAssembly.GetName().FullName);
Console.WriteLine("\nDisplaying the public key.\n");
byte []pk;
pk = myAssembly.GetName().GetPublicKey();
for (int i=0;i<pk.GetLength(0);i++)
Console.Write ("{0:x}", pk[i]);
Console.WriteLine();
Console.WriteLine("\nDisplaying the public key token.\n");
byte []pt;
pt = myAssembly.GetName().GetPublicKeyToken(); // 此行取得 PublicKeyToken
for (int i=0;i<pt.GetLength(0);i++)
Console.Write ("{0:x}", pt[i]);
}
}
}

NOI进阶之路 2006-10-26
  • 打赏
  • 举报
回复
记事本要是能打开的话,那还叫密钥文件吗??!
我晕
zCheng 2006-10-26
  • 打赏
  • 举报
回复
使用密钥编译后的程序——用反射。asm = Assembly.LoadFile(dllfile)。然后可以在 asm 中找到 好像是用 asm.GetPublicKeyToken();

要么,记事本打开密钥文件……
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-26 10:43
社区公告

让您成为最强悍的C#开发者