CSharp Tips:引用ActiveX/COM组件时的Strong Name

原创 2003年10月22日 01:24:00
问题
DotNet平台下提供了比较完备的类库,但是第一个版本总归不可能面面俱到,而且由于历史遗留问题,经常会和COM/ActiveX的组件之间进行互操作。
笔者碰到的问题就是在一个Assembly中调用到了Excel的对象,但是该Assembly需要封装成为一个ActiveX的Control,供IE的客户端脚本调用。简而言之,我在C#中用到了一个COM组件,还需要把自己封装成一个COM组件,听起来有点多余不过想不到更好的办法。
在这样的封装模式下碰到了一个问题,如果一个Assembly希望封装成为ActiveX/COM组件,那么它必须拥有强名(Strong Name),也就是说在编译的时候需要指定SNK(Strong Name Key)。但是当一个Assembly如果以拥有强名的方式编译的话,它又要求所以自身所引用的其他Assembly都必须拥有强名,否则不能够成功编译。而当我们在工程中直接引用一个COM组件(例如:Excel 10 Object Library),VS.Net能够帮助我们自动导入类型库,但是此时的引用类型库是没有强名的,在笔者所期望的环境下无法编译成功。
 
解决
碰到这个问题觉得很棘手,似乎陷入和死循环,不过查阅一下文档,发现还是非常容易解决的,DotNet Framework中提供了相应的工具能够转换COM的类型库,他就是TlbImp.exe(大家可以在类似“C:/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1”的目录中找到)。TlbImp能够将一个COM组件包装成为DotNet可以使用的类库的形式,VS.Net的自动转换想必也是以来这个工具。该工具有很多参数开关,需要支持强名只要额外打开一个开关即可。一下介绍笔者认为最可能用到的参数:
/out:Filename:类型库转换之后输出文件的名称。
/namespace:Namespace:类型库转换所使用的名称空间。
/keyfile:FileName:指定转换时使用的SNK文件,指明该参数,构造之后的类型库就拥有了强名。
完整的例子如下:
tlbimp excel.exe /out:interop.excel.dll /namespace:Excel /keyfile:excel.snk
其中snk文件可以通过DotNet中的另一个工具SN生成,此处不再赘述。
完成上述工作,在工程中直接引用我们自己构造的类型库,就可以成功的编译拥有强名的DLL了。
 
如果是控件,而不是普通的Component,那么就不能够使用tlbimp,而需要使用aximp.exe这个工具,使用方法与tlbimp类似,他会生成两个文件:一个是类型库的代理文件,另一个是Windows Form的代理文件。
 
进一步解决
然而还有更加简单的解决办法,就是在工程属性中设置“Wrapper Assembly Key File”(Common Properties/General/Wrapper Assembly Key File),这个属性。设置了该属性之后通过Add Reference添加的COM/ActiveX组件,都将被标识,拥有强名。
这需要一次设置就可以了,应该更加方便。
 
 
参考文档
 

C++调用C# com组件:一个完整的的小例子

我们知道C#开发效率是非常高的,特别是做一些漂亮的页面就更适合用它了啊.如果你开发一个桌面应用程序即想性能好点又想页面漂亮点可以考虑用C++和C#一起用.反正现在Win7都集成NetFramework...
  • weiwenhp
  • weiwenhp
  • 2012年06月07日 14:34
  • 15080

C#与DLL和COM的混合编程(2)-C#调用COM组件

C#调用COM组件这部分描述了在托管代码中调用COM组件的方法,现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源  向.NET Framework报露COM组件1. Impor...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月17日 01:08
  • 5339

Csharp调用微软COM转换word为HTML

使用微软的office中的word软件只要使用另存为就可以把一个word保存为HTML网页文件。但如何通过程序调用完成转化呢?  一下使用office 2007为例,其他版本略有不同。  1添加引用,...
  • xuexiaodong2009
  • xuexiaodong2009
  • 2015年07月10日 15:56
  • 1309

COM组件、ActiveX、OCX区别

COM 组件就是一组接口的集合,实现了 IDispath 接口的 COM 组件叫做 自动化组件。在自动化组件的基础上,在实现规定的接口就称为 ActiveX 组件,Ocx 是 Activex 的文件载...
  • qq_20161893
  • qq_20161893
  • 2017年07月03日 12:14
  • 616

activeX com 组件开发 一

com组件开发  可以用vb   c#  vc++  等   个人对c#比较熟练 ,但是c# 做控件弊端太大,要求客户装framework 这比较强人所难 ,当然vb 也要装运行库库 ,vc++可以装...
  • studypower
  • studypower
  • 2014年09月27日 14:06
  • 1412

使用C#编写COM组件在网页中调用ActiveXObject

C#编写Com组件并在html页面调用
  • wzc1988
  • wzc1988
  • 2016年11月16日 16:38
  • 705

在网页中使用COM组件(或activex控件)中的一些常见问题

在网页中使用COM组件(或activex控件)中的一些常见问题1. 在页面中插入控件 **2. 使用控件中的事件**方法1:function ok(){ } do...
  • sinat_34909640
  • sinat_34909640
  • 2016年11月22日 10:28
  • 388

OLE、ActiveX 、COM和普通DLL的简单理解

COM: COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 COM组件是遵循COM规范编写的 COM组件是一些小的二进制可执行文件 COM组件可以给应用程序...
  • Liekkas
  • Liekkas
  • 2015年04月27日 11:22
  • 1173

理一理COM、OLE、ActiveX~~

听了,学了,用了很多COM、OLE、ActiveX的技术,但是一直是一团模糊的概念,只知道这三样东西都是一路货色,但是具体有什么区别呢,没有去深究,今天心血来潮,上网查了一些资料,终于有点清楚了~~~...
  • lemonbox
  • lemonbox
  • 2010年07月21日 17:07
  • 5654

COM之ActiveX逆向简单方法

一.前言. 以下IE中ActiveX控件中对调用的属性,方法等的一些逆向分析纪录文字. 阅读此文你许要一点点的com基础知识.:) 二.认识ActiveX IE中可以调用几乎所有在...
  • farcall
  • farcall
  • 2011年02月26日 03:14
  • 2565
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CSharp Tips:引用ActiveX/COM组件时的Strong Name
举报原因:
原因补充:

(最多只允许输入30个字)