Johnson 的个人资料煮雪试新茶,抚琴邀明月照片日志列表更多 工具 帮助
8月28日

在ASP中调用DLL的方法

在ASP中调用DLL的方法

.net的dll已经不是严格意义上的动态连接库了,而是一个类或者类库。它是不能直接在ASP、VB等其它的应用
环境中使用的。 我们可以通过COM包装器(COM callable wrapper (CCW))来将.net的dll再次包装,通过这个中间介质来实现相应的功能。

以下是一个小例子,供大家参考。
1. 在.net Visual Studio 中新建一个Class项目。
2. 在项目中新添加一个类,代码如下:

using System;

namespace ClassLibrary1
{


//定义接口,这点很重要 (此接口中的方法与COM组件中的方法一致)
public interface iClass1
{

string test() ;

}


public class Class1 : iClass1
{

private string t = "";
//实现接口中的方法
public string test()
{

return "ok";
}
}
}

3.在.NET命令行窗口中,创建密钥对。
可以用.net 自带的工具:sn.exe 来创建密钥对。
如:SN –k testDll.Keys
4. 创建强命名程序集(Strong Name Assembly)
在AssemblyInfo.cs文件中,添加[assembly: AssemblyKeyFile(@"c:\test.keys")]属性

5. 编译整个项目,生成ClassLibrary1.dll (此DLL可在 \bin\Debug 路径下找到。)
6. 在.NET命令行窗口中,生成类型库
tlbexp ClassLibrary1.dll /out:ClassLibrary1.tlb

7. 在.NET命令行窗口中,注册装配件
regasm /tlb:ClassLibrary1.tlb ClassLibrary1.dll

8. 在.NET命令行窗口中,将.NET装配件安装到全局装配件缓存(GAC)中
gacutil /i ClassLibrary1.dll

9. 在asp中测试
<%
SET s = CreateObject("ClassLibrary1.Class1")
Response.Write(s.test())
%>
-----------------------------------------------


动态联接库(DLL)可以加快应用程序关键部分的执行速度,同时通过统一的COM接口调用,对DLL的使用也可以最大限度地发挥组件的重用性。用户不必关心DLL采用什么语言编写,只需关注其提供了哪些功能及接口参数,便可以为我所用。
目前,基于.Net技术编写的DLL组件越来越多,而传统的ASP中如果也可以应用这些组件提供的功能,可以避免很多程序员无谓的劳动。最近本人在工作中需要在ASP中调用.Net环境下生成的DLL,做过一些研究,特将自己的经验共享出来。其实都是很简单的东西,高手尽管嘲笑,呵呵~

1、在ASP中调用传统的ActiveX DLL
要想让COM能够“看到”你的组件,必须先将组件注册到注册表中:
regsvr32 mydll.dll
然后在ASP中创建对象:
set mydll= server.createobject("mydll.method")
mydll.method
这样就可以使用组件中的属性和方法了。

2、在ASP中调用基于.Net开发的 DLL
关于组件注册,一种方法是自动注册,在vs.net2003或2005的IDE环境中可以实现COM组件的自动注册,设置如下:项目名称->右键"属性"->配置属性->生成->选中"为Com Interop注册",编译即可。
另一种方法是手动注册:
regasm mydll.dll /tlb:mydll.tlb /CodeBase
注意CodeBase的使用,如果你要注册的.NET程序集没有强名称的话,那么在使用regasm注册的时候就要加上/CodeBase。
注册完毕,创建对象及使用方法与上面相同:
set mydll= server.createobject("mydll.method")
mydll.method

其实,不只是ASP,其他的COM程序(包括VBA、扩展存储过程等等)调用DLL的方法都是一样的。

有关于regasm的参数,请参考:
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cptools/html/cpgrfassemblyregistrationtoolregasmexe.asp


首先到这里看代码:
http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=35935

里面有两个方法
Encrypt(string pToEncrypt,string sKey) //加密
Decrypt(string pToDecrypt,string sKey) //解密

然后你这样写代码:
using System;
using System.Runtime.InteropServices;
namespace 名称空间
{
// 首先建立接口,这个是Com必须使用的
[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]
public interface IEncrypt
{
string Encrypt(string pToEncrypt,string sKey);
string Decrypt(string pToDecrypt,string sKey);
}

// 写接口的实现
[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]
public class 类名称 : IEncrypt
{
public string Encrypt(string pToEncrypt,string sKey)
{
// 复制FAQ加密代码
}

public string Decrypt(string pToDecrypt,string sKey)
{
// 复制FAQ解密代码
}
}
}

然后用vs.net打包成.dll类库文件,假设名称为MyEncrypt.dll
然后用如下工具
regasm MyEnCrypt.dll /tlb:MyEncrypt.tlb
这个.tlb文件就是类型库,可以由vb6和vc++6引用。

注意上面的guid是使用vs.net工具菜单里面的创建guid工具生成的。
还要注意,vs.net自动生成的assemblyinfo.cs文件中必须添加强名称和版本号,因为Com组件需要版本号,不要改动版本号,也不要用vs.net自动的1.*这样的版本号,最好使用
1.1.1.1这样的固定版本,而且必须一次添加,不能多次添加。


步骤
一 生成.net程序集:
首先你把http://expert.csdn.net/Expert/FAQ/FAQ_Index.asp?id=35935的代码复制。
然后你复制这个代码
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
namespace Csic
{
// 首先建立接口,这个是Com必须使用的
[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]
public interface IEncrypt
{
string Encrypt(string pToEncrypt,string sKey);
string Decrypt(string pToDecrypt,string sKey);
}

// 写接口的实现
[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]
public class Crypt : IEncrypt
{
public string Encrypt(string pToEncrypt,string sKey)
{
// 复制FAQ加密代码
}

public string Decrypt(string pToDecrypt,string sKey)
{
// 复制FAQ解密代码
}
}
}

把上面的文件保存成vs.net项目的一个类库工程。
然后使用vs.net的“Vsitual Studio .Net工具”-->Vistual Studio .Net命令提示符
在命令行内打下
cd c:\ <回车>
sn -k myKey.snk<回车>
就在C盘根目录下生成一个名叫myKey.snk的强名称文件,然后关闭提示符窗口。
在vs.net的那个类库工程自动生成的AssemblyInfo.cs文件内把
[assembly: AssemblyKeyFile("")]
改成
[assembly: AssemblyKeyFile(@"C:\myKey.snk")]
把[assembly: AssemblyVersion("1.0.*")]
改成
[assembly: AssemblyVersion("1.0.0.0")] // 注意:这时你的Com组件版本为1.0.0.0版

然后按Shift + Ctrl + B键生成dll库(使用Release模式),假设是Csic.Crypt.dll。
这时候,程序集就建立成功了。

二、注册该程序集并创建一个类型库
仍然使用开始菜单中的Vistual Studio .Net命令提示符
进入你的项目目录,假设为D:\myProject\bin\Release
在对话框中输入
d:<回车>
cd myproject\bin\release<回车>
然后输入 dir 命令可以看见Csic.Crypt.dll文件
然后输入:regasm /tlb Csic.Crypt.tlb Csic.Crypt.dll<回车>
然后就在这个目录下生成了Csic.Crypt.tlb类型库文件。不要关闭此提示符窗口。
这时候,这个.dll的.net程序集就变成一个标准的Com组件了,但是还不能用,必须让它变成全局Com组件。

这个regasm 实用程序将创建一个类型库并在 Windows 注册表中对其进行注册,以使 PhysServer2.dll 中的类对 COM 客户端可用 。

三、 将程序集添加到全局程序集缓存中

进入提示符窗口,输入
gacutil /I Csic.Crypt.dll<回车>
这时,你的这个dll就被复制到全局程序集缓存中了。也就是说无论在这个电脑的哪个硬盘上都可以使用此dll组件了。

四、使用方法
asp内的使用方法
set obj = Server.CreateObject("Csic.Crypt")
dim str1
str1 = obj.Encrypt("要加密内容","密码") // 加密
dim str2
str2 = obj.Decrypt("要解密内容","密码") // 解密

8月26日

夜凉如水

夜凉如水,秋虫发出唧唧的声音。对面楼上人家昏黄的灯光让我想起江南的春夜:三三两两的煤油灯,矮矮的人字脊瓦房,水杉树绽出淡淡的黄绿色叶蕾,农人在暮色中劳作,白萝卜吐出一缕缕叶芽。雨一丝一丝飘下来,飘下来,如针尖,如牛毛,在新翻的农田里,在农人老旧的蓑衣上,在淡黄色的溪水里,在少年落寞的梦里。呀,不可思议的时空变幻呀,不可思议的光阴匆匆呀!那个在烟雨迷蒙中满腹惆怅的少年呢?那个在芦苇荡里得意地吹响苇笛子的少年呢?那个在水杉树上为陌生行人挂上糖果的少年呢?已经远去,已经远去,已经真的远去了。我只能对着首都的高楼大厦,写几行不着边际的代码。那些凄美的时光呢?它们为何一去不复返呢?连同那时的逻辑,那时的感触,那时的梦想,乃至那时的秘密,都消失在白雾渺渺的仙踪林,当我去找寻,它却掩藏在蟋蟀的叫声中,掩藏在布谷鸟的歌喉中,掩藏在邻家女孩羞涩的笑容中,难追忆,却会突然想起,泪潸潸汗涔涔,唏嘘不已。
8月18日

可提升免疫力的水果、蔬菜有哪些

可提升免疫力的水果、蔬菜有哪些

    抗病的关键是依靠人体自身的免疫系统,尤其妇女、儿童等人群机体免疫力相对低下,机体免疫系统的活力对抵御疾病的侵袭至关重要。因此,良好的营养会为儿童和其他人群的免疫力提供支持。并使儿童的免疫功能始终保持在良好的状态,而它们就摆放在我们身边的食品商店里。
    颜色鲜艳的水果和蔬菜
    西红柿、胡萝卜、酸浆果、金桔和菠菜等都富含抗氧化物,这种抗氧化物能保持机体免疫细胞免遭环境中不良因素的侵袭,并加强白细胞杀伤外来微生物的能力。同时,由于这些食物中还含有大量的维生素c,因此有利于抵御病毒感染,且能使患者迅速康复。
    优质蛋白
    当一个人感冒或发热时,机体将需要比平时多得多的热卡去战胜疾病,同时机体的免疫系统也依赖各种氨基酸的摄取来修复。在患病之前或初期,人体内是否具备了这些蛋白质是十分重要的。当机体遭受病毒侵袭时,人体产生的大量抗体(又叫免疫球蛋白)实际上就是蛋白质,它们能中和某些感染因子,杀灭病原菌并将其消除体外。使机体处于良好免疫状态的这些蛋白质来源包括蛋类、瘦肉和豆制品等。
    维生素e
    研究证实,不论是老年人还是年轻人,机体内充足的维生素e能明显增强t细胞抗感染的能力。研究还发现,人体通过饮食摄入的维生素e通常难以达到有效抗病毒的免疫水平,因此专家推荐每日补充200国际单位的维生素e,以预防病毒的侵袭。当然,维生素e含量丰富的食物,如杏仁、麦芽和各种深绿色蔬菜也是必不可少的。
    大蒜和洋葱
    在欧美民间,流行饮用洋葱汁治疗咳嗽的方法。研究发现,洋葱能增强t细胞的免疫活性,从而增进整体的免疫反应。含类似大蒜和洋葱中免疫活性物质的食物,在人体内可充当清洁和杀毒剂的角色,起到杀灭和清除毒物和病菌的作用。
    复合维生素
    人体免疫功能需要多种维生素的帮助,因此有人认为,每日摄入多种维生素如同买下了一份廉价的健康保险。复合维生素不同于单一维生素:仅补充后者可能扰乱体内其他营养素的吸收,甚至会中毒,而补充多种维生素则因其保持着一种平衡,因此无不良影响。但这不意味补充多种维生素能取代营养丰富的饮食,因为食物的许多其他化合物在免疫防御中所起的作用是多种维生素办不到的。

8月6日

山之赋

连绵起伏的山,
固然是一道亮丽的风景,
迤逦不止的行程,
恰似登山者心路的悠远。
 
一夜风雨过去,
山中的青杏白了,
遍地丛生的野枣,
绿得泛出油光,
 
真正的登山者,
即使走过千山万水,
也能于一花一草前感动,
感动不止,攀登不息。