关于C#强名称签名

关于C#强名称签名,第1张

不知道你想问什么?

我就简单说说,有了强名称,可以部署到系统共享缓存当中,即C:\WINDOWS\assembly,你仔细看下这里面的文件

再项目中使用强名称的方法:

1。在解决方案资源管理器中,选择项目名称右键属性==〉签名==〉为程序集签名选中=〉新建一个,名称好像没特殊要求,随便起,不过没测试过特殊字符,新建时一般不选择加密的。

如果想部署到assembly,还必须执行2个步骤。

2。选择生成=〉选择为Com Interop注册=〉自动

3。还必须将AssemblyInfocs中的[assembly: ComVisible(false)]修改为[assembly: ComVisible(true)]

ok,你就可以使用regasm 和gacutil 命令来部署了。

不知道回答的是不是你要知道的。

一、准备工作

具体说来,编程实现COM-->Assembly的功能,需要使用的以前几个类:

SystemRuntimeInteropServices

-TypeLibConverter提供一组服务,将托管程序集转换为 COM 类型库或进行反向转换。

-ITypeLibImporterNotifySink提供回调机制,以供类型库转换器向调用方通知转换的状态,并在转换过程本身之中涉及调用方。

SystemReflection

-StrongNameKeyPair(可选)封装对公钥或私钥对的访问,该公钥或私钥对用于为强名称程序集创建签名。

SystemReflectionEmit

-AssemblyBuilder 定义并表示动态程序集。

此外,还需要使用一个WinAPI,LoadTypeLibEx,具体定义如下:

[DllImport( "oleaut32dll", CharSet = CharSetUnicode, PreserveSig = false )]

private static extern void LoadTypeLibEx(String strTypeLibName, RegKind regKind, [MarshalAs(UnmanagedTypeInterface)] out Object typeLib );

为了让这个WinAPI function可以正常使用,我们还需要定义一个枚举,

private enum RegKind

{

RegKind_Default = 0,

RegKind_Register = 1,

RegKind_None = 2

}

注:上述类的说明来自MSDN。

大家都看到了,上述几个类中,仅有StrongNameKeyPair是可选的,这是因为如果我们不需要生成PIA,那么是不需要使用这个类的。同时,如果需要生成PIA,那么需要提供相应的密钥文件。在后面的描述中,我们将使用《走近COM Interop--浅谈PIA》中的例子做进一步的演示。

二、实战演练

在此,我们仍就由VB生成的PIADemodll展开演示。

1 载入一个COM组件

Object typeLib;

LoadTypeLibEx("PIADemodll", RegKindRegKind_None, out typeLib);

if(typeLib == null )

{

throw new Exception("载入失败!");

}

2 定义一个实现ITypeLibImporterNotifySink接口的类,基于提供回调机制,以供类型库转换器向调用方通知转换的状态,并在转换过程本身之中涉及调用方。

public class ConversionEventHandler: ITypeLibImporterNotifySink

{

public void ReportEvent(ImporterEventKind eventKind, int eventCode, string eventMsg )

{

// Do nothing

}

public Assembly ResolveRef(object typeLib)

{

// 此处直接返回null,避免把演示复杂化了

return null;

}

}

3 将COM类型库生成程序集

A 生成PIA Assembly

FileStream stream = new FileStream("commonsnk", FileModeOpen);

try

{

StrongNameKeyPair pair = new StrongNameKeyPair(stream);

TypeLibConverter converter = new TypeLibConverter();

ConversionEventHandler eventHandler = new ConversionEventHandler();

AssemblyBuilder ab = converterConvertTypeLibToAssembly(typeLib, "interopPIADemodll", TypeLibImporterFlagsPrimaryInteropAssembly, eventHandler, null, pair, null, null);

abSave("interopPIADemodll");

MessageBoxShow("Importing is ok");

Assembly asm = AssemblyLoadFile(ApplicationStartupPath + @"\interopPIADemodll");

Type t = asmGetType("interopPIADemoTestClass");

object obj = tInvokeMember(null, BindingFlagsDeclaredOnly | BindingFlagsPublic | BindingFlagsNonPublic | BindingFlagsInstance | BindingFlagsCreateInstance, null, null, null);

string ret = (string)tInvokeMember("Format", BindingFlagsDeclaredOnly | BindingFlagsPublic | BindingFlagsNonPublic |

BindingFlagsInstance | BindingFlagsInvokeMethod, null, obj, new object[]{"Go!"});

MessageBoxShow(ret);

}

catch(Exception ep)

{

if(stream != null)

{

streamClose();

}

MessageBoxShow(epMessage);

}

B 生成一般的Assembly

TypeLibConverter converter = new TypeLibConverter();

ConversionEventHandler eventHandler = new ConversionEventHandler();

AssemblyBuilder ab = converterConvertTypeLibToAssembly(typeLib, "interopPIADemodll", 0,

eventHandler, null, null, null, null);

abSave("interopPIADemodll");

MessageBoxShow("Importing is ok");

Assembly asm = AssemblyLoadFile(ApplicationStartupPath + @"\interopPIADemodll");

Type t = asmGetType("interopPIADemoTestClass");

object obj = tInvokeMember(null, BindingFlagsDeclaredOnly | BindingFlagsPublic | BindingFlagsNonPublic | BindingFlagsInstance | BindingFlagsCreateInstance, null, null, null);

string ret = (string)tInvokeMember("Format", BindingFlagsDeclaredOnly | BindingFlagsPublic | BindingFlagsNonPublic |

BindingFlagsInstance | BindingFlagsInvokeMethod, null, obj, new object[]{"Go!"});

MessageBoxShow(ret);

需要说明几点:

1 上述示例中使用的PIADemodll和Commonsnk都需要被copy至测试程序的bin目录中,否则,就需要指定可达到的文件路径。

2 AssemblyLoadFile的参数是要加载的文件的绝对路径,相对路径将会引发异常。

使用 GAC

全局程序集缓存 (GAC) 是一种代码缓存,它在任何带有已安装的 CLR 的机器(例如已安装了 CFNET 的 Pocket PC)上都可用。旨在跨应用程序共享的程序集可以存储在这里,而其必须有一个强名称。注意,安装了 GAC 的程序集必须有匹配的程序集名称和文件名,不包括文件扩展名(因此 MyAssembly 必须与 MyAssemblydll 或 MyAssemblyexe 配对)。

将程序集安装在 GAC 中有什么好处?

• 一个共享的位置意味着基于 RAM 的安装不需要有重复的 DLL(同一版本且同一文件名)耗费宝贵的空间。

• 并行版本允许同一 DLL 名称的多个版本对 CFNET 应用程序可用。在编译时,程序集存储它们所依照生成的程序集版本信息,这意味着他们将永远使用相同的程序集版本运行。因此,即便是此 DLL 的更新的版本可用,程序集也会继续使用旧的 DLL,从而防止了任何类型的向下不兼容。

• 其他好处在于在桌面上使用 GAC,但不与压缩框架共享。

所有 CFNET 基类库都安装在 GAC 中,那么您还在等什么?您可能已经注意到了 Pocket PC 的 \Windows 目录中前缀为“GAC”的文件。CLR 将访问 Cgautilexe 实用工具来用关于安装了 GAC 程序集的信息更新 GAC。要将您的程序集安装到 GAC 中,首先用一个强名称为其签名,然后在您的应用程序部署过程中包括一个文本文件(扩展名为 GAC),如 CAB 文件。这个 GAC 文件需要放在 \Windows 目录中,而且应该用 ANSI 或 UTF-8(不用 Unicode)编码。

以上就是关于关于C#强名称签名全部的内容,包括:关于C#强名称签名、如何用C#将COM组件转换成程序集、GAC是什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9302945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存