如何实现.NET组件与vb.net com组件件之间的互操作

& & 在我的编程实践中,需要从.NET的Web Form页面传递加密的字符串信息(如用户名和密码等)到ASP页面,然后在该页面对该加密字符串进行解密。如果传递的不是加密串,通过GET或POST的方式就可以直接传递并在ASP页面中接收,但问题是在.NET的Web Form页面中加了密的在我的编程实践中,需要从.NET的Web Form页面传递加密的字符串信息(如用户名和密码等)到ASP页面,然后在该页面对该加密字符串进行解密。如果传递的不是加密串,通过GET或POST的方式就可以直接传递并在ASP页面中接收,但问题是在.NET的Web Form页面中加了密的字符串如何才能在ASP中进行解密呢?这主要由于ASP并不能直接访问由.NET提供的托管类和组件。这时我们就只能借助于COM组件来实现了,通过COM的互操作我们可通过.NET生成COM组件,然后在ASP页面中访问该COM组件就可以了。& & 本文实现的是将加密的用户名与密码从.aspx页面传递到.asp页面,下面就来介绍这些操作的具体步骤:& & 一、制作具有加密、解密字符串的.NET程序集(VS.NET类库工程)& & 这个程序集将会变成COM组件,使用DES对称加密代码,可以加密码,可以加密解密,支持中文!& & //文件名:StringCrypt.cs& & using S& & using System.Runtime.InteropS& & using System.Security.C& & using System.IO;& & using System.T& & namespace jonson& & {& & // 首先建立接口,这个是Com必须使用的& & [Guid("BF6F9C17-37FA-4ad9-16F2C")]& & public interface IEncrypt& & {& & string Encrypt(string pToEncrypt,string sKey);& & string Decrypt(string pToDecrypt,string sKey);& & }& & //接口的实现& & [Guid("3FBDBB63-3C36--73EDB0F167D0")]& & public class StringCrypt : IEncrypt& & {& & // 加密的方法& & public string Encrypt(string pToEncrypt, string sKey)& & {& & DESCryptoServiceProvider des = new DESCryptoServiceProvider();& & //把字符串放到byte数组中& & byte[]
inputByteArray
Encoding.Default.GetBytes(pToEncrypt);& & //byte[]
inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);& & //建立加密对象的密钥和偏移量& & //原文使用ASCIIEncoding.ASCII方法的GetBytes方法& & //使得输入密码必须输入英文文本& & des.Key
ASCIIEncoding.ASCII.GetBytes(sKey);& & des.IV
ASCIIEncoding.ASCII.GetBytes(sKey);& & MemoryStream
MemoryStream();& & CryptoStream
CryptoStream(ms,
des.CreateEncryptor(),CryptoStreamMode.Write);& & //Write
stream& & //(It
stream)& & cs.Write(inputByteArray,
inputByteArray.Length);& & cs.FlushFinalBlock();& & //Get
string& & StringBuilder
StringBuilder();& & foreach(byte
ms.ToArray())& & {& & //Format
hex& & ret.AppendFormat("{0:X2}", b);& & }& & ret.ToString();& & return
ret.ToString();& & }& & // 解密的方法& & public string
Decrypt(string pToDecrypt,
string sKey)& & {& & DESCryptoServiceProvider des = new DESCryptoServiceProvider();& & //Put
array& & byte[]
inputByteArray = new byte[pToDecrypt.Length / 2];& & for(int x = 0; x < pToDecrypt.Length / 2;
x++)& & {& & int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));& & inputByteArray[x] = (byte)i;& & }& & //建立加密对象的密钥和偏移量,此值重要,不能修改& & des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);& & des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);& & MemoryStream ms = new MemoryStream();& & CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);& & //Flush the data through the crypto stream into the memory stream& & cs.Write(inputByteArray, 0, inputByteArray.Length);& & cs.FlushFinalBlock();& & //Get the decrypted data back from the memory stream& & //建立StringBuilder对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象& & StringBuilder ret = new StringBuilder();& & return System.Text.Encoding.Default.GetString(ms.ToArray());& & }& & }& & }& & 说明:注意上面的Guid是使用vs.net工具菜单里面的创建guid工具生成的,这个每个Com组件所必须的。输入密匙的时候,必须使用英文字符,区分大小写,且字符数量是8个,不能多也不能少,否则出错。& & 然后使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符。在命令行内打下cd c:\ & & sn -k myKey.snk& & 这样就在C盘根目录下生成一个名叫myKey.snk的强名称文件,然后将其拷贝到上述工程目录中(与StringCrypt.cs文件同目录)后关闭提示符窗口。& & 在vs.net的那个类库工程自动生成的AssemblyInfo.cs文件内& & 把[assembly: AssemblyKeyFile("")]改成[assembly: AssemblyKeyFile("../../myKey.snk ")]& & 把[assembly: AssemblyVersion("1.0.*")]改成[assembly: AssemblyVersion("1.0.0.0")] // 注意:这时你的Com组件版本为1.0.0.0版& & 然后按Shift + Ctrl + B键生成dll库(使用Release模式),StringCrypt.dll。这时候,程序集就建立成功了。& & 二、注册该程序集并创建一个类型库& & 仍然使用开始菜单中的Visual Studio .Net命令提示符& & 进入你的项目目录,假设为D:\project\bin\Release& & 在对话框中输入& & d:& & cd project\bin\release& & 然后输入 dir 命令可以看见StringCrypt.dll文件& & 然后输入:regasm StringCrypt.dll& & 然后就在这个目录下生成了StringCrypt.tlb类型库文件。不要关闭此提示符窗口。& & 这时候,这个.dll的.net程序集就变成一个标准的Com组件了,但是还不能用,必须让它变成全局Com组件。& & 这个regasm 实用程序将创建一个类型库并在 Windows 注册表中对其进行注册,以便 COM Services可以访问.NET组件。在使用regasm对.NET进行注册之后,标准的Windows客户就可以后期绑定组件中的类。注册组件的过程必须一次完成。在.NET组件被注册之后,所有的COM 客户都可以访问它。& & 三、将程序集添加到全局程序集缓存中& & 在使用.NET程序集之前,我们必须把程序集安装到全局的高速缓存中。为此进入Visual Studio .Net提示符窗口,输入& & gacutil /I StringCrypt.dll& & 这时,你的这个dll就被复制到全局程序集缓存中了。也就是说无论在这个电脑的哪个硬盘上都可以使用此dll组件了。& & 四、使用方法& & 1. 在source.aspx中生成加密串& && & …& & jonson.StringCrypt crypt = new jonson.StringCrypt();& & String tmpstr =
username+"^"+& & … …& & strinfo = crypt.Encrypt(tmpstr,"fk58Fgju"); // fk58Fgju为密匙& & Response.Redirect("target.asp?info="+strinfo);& & 2. 在target.asp页面中接收并解密字符串& & info = Request.QueryString(“info”)& & set bj = Server.CreateObject("jonson.StringCrypt")& & str1 = obj.Encrypt(info,"fk58Fgju") // 解密& & 本文的顺利实现,得到了网友TomMax(笑望人生)等人的大力帮助,在此表示衷心的感谢。& & 原文转自:http://www.ltesting.net
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程2012年12月 .NET技术大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。developerWorks 社区
软件的互操作性是一个我们经常面临的问题,如果 Java 可以自由的调用其他语言和平台的成熟代码,可以充分利用您的 Java 技能,大大提高您的生产力。现有的 Java COM 互操作技术有很多种实现,JACOB 开源项目提供了一个简单方便的通用调用框架,本文就结合一个实例来介绍 JACOB 项目的使用和优点。
, 软件工程师, IBM
杨晓峰,软件工程师,中国软件开发中心 IBM InfoSphere Content Collector 项目组,对 Java/J2EE 和数据库等技术拥有浓厚的兴趣。
, 软件工程师, IBM
仇璐,软件工程师,中国软件开发中心 Data Studio Warehousing Tools Development 项目组,对 J2EE,数据库以及 Eclipse 插件开发等拥有浓厚的兴趣。
我们在实现复杂软件或者进行集成环境的测试时,往往要与各种应用程序打交道。理想情况下,如果能用一种编程语言实现所有功能是很令人憧憬的,但由于遗留代码、语言的能力和厂商的互操作性的策略不同,这往往是一个不现实的目标。比如您可以使用 C#,C++ 或 VB 等语言方便的操作 Outlook 邮箱,但是如果您是一个 Java 程序员,事情就不那么简单了。如果我们可以在 Java 中调用 COM 组件,就可以充分利用您的 Java 技能和现有的成熟 COM 工具包,大大简化应用开发的过程。COM 组件提供了一种与其他语言的互操作方式,叫做自动化(Automation)。现有的 Java COM 互操作的解决方案有很多种,由于设计目的的不同,在性能、易用性等方面都有很大的区别。本文介绍的 JACOB 开源项目,致力于简化 Java 操作 COM 组件,提供了一个虚拟机独立的自动化服务器实现,由于其通用性设计,您可以非常简单地完成对现有应用的集成。JACOB 项目的由来首先,我们将了解 JACOB 项目的基本情况,探讨在什么样的情况下选择它来完成您的任务有关自动化的更多细节,您可以参考相关文档和书籍,我们仅做简单介绍。调用 COM 中暴露出来的方法,主要有两种机制:早期绑定和晚期绑定。早期绑定显式的声明对象、数据类型等,编译器获取了足够的信息在编译期进行链接和优化,这样通常可以获得更好的性能,通过这种机制实现 Bridge 调用可以参考 IBM 的 RJCB 项目,它提供了一套高性能的解决方案。当然您需要了解更多 COM 组件的细节,虽然框架为您完成了大部分的生成 Bridge 代码的工作,但是总体来说,编码工作量还是偏大,编码难度也比较高,而且 RJCB 仅支持那些提供早期绑定的 vtable 接口的 COM API。而晚期绑定方式是通过 接口来实现,类似 Java 的反射机制,您可以按照名称或者 ID 进行方法调用,这种设计主要目的是支持脚本语言操作 COM,因为脚本是解释执行的,通常都不支持指针也就没有 C++ 中的 vtable 机制,无法实现早期绑定。这种方式的缺点是在一定程度上性能较差,由于是在运行时按照名字或者 ID 进行对象的调用,只有运行时才确切知道调用的是哪个对象,哪个方法,这样必然带来一定的开销和延迟。但是这种方式的优点也是非常明显的,简单、灵活,您可以不必关注动态链接库的细节,可以非常快地完成代码开发工作。JACOB 开源项目提供的是一个 JVM 独立的自动化服务器实现,其核心是基于 JNI 技术实现的 Variant, Dispatch 等接口,设计参考了 Microsoft VJ++ 内置的通用自动化服务器,但是 Microsoft 的实现仅仅支持自身的 JVM。通过 JACOB,您可以方便地在 Java 语言中进行晚期绑定方式的调用。下图是一个对 JACOB 结构的简单说明图 1. JACOB 基本结构您可以综合考虑时间、技术难度、性能要求等各方面来选择适合您的解决方案,下面结合在实际的订单处理系统的部分功能的开发,向您展示使用 JACOB 技术进行开发的成本优势。一个实际案例的演示首先,了解一下用户场景:某开发团队要利用一个订单处理的工作流系统,对现有的业务方式进行集成、优化。原有的业务处理方式是基于邮件系统的半人工方式,业务人员将订单以邮件方式发送到特定邮箱,然后后续人员处理订单。现在设计的集成方式是,处理引擎定期轮询订单邮箱,以特定命名规则区分订单,获取存储在邮件正文和命名属性中的订单信息,将订单放入处理队列进行进一步处理,最后将源邮件标记状态并移出订单目录。开发工作中遇到的难点是,应用的核心部分是基于 Java 实现的工作流应用,而客户使用 Outlook/Exchange 邮件系统,开发团队并没有足够的人力和时间去为其开发纯 Java 实现的客户端,Java 程序也难以操作邮件命名属性的信息。下面我们就尝试利用 JACOB 和一些成熟的 COM 组件来解决这个问题。配置您的开发和运行环境我们的例子是一个基于 Eclipse 的 Java 工程。首先,使用 JACOB 来“搭桥”,您需要下载最新的 JACOB 相关类库,包括 Jacob.jar 和 Jacob.dll,将 jar 文件添加到您的 Eclipse 工程的构建路径。图 2. 修改工程的构建路径由于我们要通过 JNI 调用 DLL 文件,所以您需要把 DLL 文件添加到系统的 PATH 环境变量中,或者您也可以在程序中设置运行时的 PATH 变量。图 3. 将 DLL 文件添加到 PATH 变量中一个简单的“桥”已经搭起来了,您就可以轻松的调用您熟悉的 COM 类库了,我们这里以 Redemption 工具包为例来完成 Outlook 相关操作,它提供了对 Outlook 对象的比较完整的操作,可以方便的绕过 Outlook 对象模型所隐藏的一些细节部分。同时,Redemption 提供了对任何 IDispatch 友好的语言的支持。您需要在操作系统中注册 COM 组件,可以使用 Redemption 工具包本身提供的安装程序,也可以采用 Windows 系统自带的 REGSVR32 工具来注册 DLL 文件。实现业务逻辑完成上面的准备工作后,就开始实现具体的业务逻辑了。首先,要获取邮件您需要登录到指定邮箱,Outlook profile 中存储了您的邮箱的基本信息,下面的例子是如何登录特定 profile:public void logon(String profile, String password) {
// 登录到指定 Profile,并获取一个会话
ActiveXComponent session = new ActiveXComponent("Redemption.RDOSession");
Dispatch.call(session, "Logon", profile, password, false, true);
}现在已经能够访问用户邮箱,我们要做的是获取收件箱中的标题以“ORDER NO:”开始的邮件,把信息存储到订单管理系统之中Dispatch items = Dispatch.call(folder, "Items").toDispatch();
int count = Dispatch.call(items, "Count").getInt();
// 轮询所有邮件,并检查符合标准的邮件
for (int x = 1; x &= x++) {
Dispatch item = Dispatch.call(items, "_Item", new Integer(x)).toDispatch();
ActiveXComponent sMail = new ActiveXComponent("Redemption.SafeMailItem");
sMail.setProperty("Item", item);
Variant vSubj = Dispatch.get(sMail, "Subject");
String subj = vSubj.getString();
if (subj.startWith(“ORDER NO”)){
// 将获取的定单信息存储到订单处理队列之中
OrderMail mail = new OrderMail(item);
mail.persistToOrderQueue();
}获取订单之后,将订单标记为已处理,这里我们通过操作命名属性的方式来标记状态,然后移动邮件到放置已处理邮件的目录:// 获取命名属性的 ID
ActiveXComponent utils = new ActiveXComponent("Redemption.MAPIUtils");
Variant namedPropID = Dispatch.call(utils, "GetIDsFromNames", orderMail,
GUID_OF_USERPROP, ORDER_STATE_DONE, true );
// 将邮件标记处理状态
ActiveXComponent utils = new ActiveXComponent("Redemption.MAPIUtils");
Dispatch.call(utils, "HrSetOneProp", orderMail, namedPropID, "Done", true );
// 将处理过的邮件移出现在的目录
Dispatch.call(orderMail, "Move",
folderForProcessedMsg);您可以看到,无需关注太多类库的细节,只需要知道要使用的对象名称、方法和输入变量,就可以轻松的调用 COM 组件。JACOB 的准备工作非常简单,并且只需要非常有限的编码,就完成了现有业务系统和新应用的无缝集成。总结简单、实用是开发人员永远的追求目标,您总是希望把有限的资源尽量应用在业务需求上,JACOB 开源项目实现了一种简单、灵活的 Java 与 COM 通信方式,为您充分利用现有应用提供了可能。
“”展示的是一个 IBM 的高性能解决方案 RJCB,它比较适合您的应用对性能要求非常高的情况。
“” 讨论了用 Bridge2Java 工具(Java 接口工具)从 Java 代码访问 COM 服务器的方法。
在 有更多 JACOB 项目的介绍和代码实例,以及 JACOB 线程机制和对象生命周期等说明。
您可以访问 获取 JACOB 的类库文件。
本文用来演示 JACOB 功能的工具包可以在 获取开发版本。
上可以找到数百篇其他的 Java 参考资料。
developerWorks: 登录
标有星(*)号的字段是必填字段。
保持登录。
单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件。
在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。
所有提交的信息确保安全。
选择您的昵称
当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。
您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。
标有星(*)号的字段是必填字段。
(昵称长度在 3 至 31 个字符之间)
单击提交则表示您同意developerWorks 的条款和条件。 .
所有提交的信息确保安全。
文章、教程、演示,帮助您构建、部署和管理云应用。
立即加入来自 IBM 的专业 IT 社交网络。
免费下载、试用软件产品,构建应用并提升技能。
static.content.url=/developerworks/js/artrating/SITE_ID=10Zone=Java technology, Open sourceArticleID=454250ArticleTitle=通过 JACOB 实现 Java 与 COM 组件的互操作publish-date=

我要回帖

更多关于 .net 引用com组件 的文章

 

随机推荐