环境中使用的。 我们可以通过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.****.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.****.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("要解密内容","密码") // 解密
在ASP中调用DLL的方法的更多相关文章
-
java中调用dll文件的两种方法
一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.****.net/shendl/article/details/3589676 JNativ ...
-
在C++中调用DLL中的函数 (3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
-
Unity中调用DLL库
DLL -- Dynamic Link Library(动态链接库文件),这里以Window平台为例. Unity支持的两种语言生成的DLL库(C++.C#),这里以C#为例,C++网上可以搜索很详细 ...
-
在C++中调用DLL中的函数(3)
1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...
-
C#中调用Dll动态链接库
C#中调用Dll动态链接库 起始 受限于语言的不同,我们有的时候可能会用别人提供的函数及方法 或者其他的什么原因.反正就是要调!!! 恰巧别人所使用的的语言跟自己又不是一样的 这个时候想要调用别人的函 ...
-
JavaScript文件中调用AngularJS内部方法或改变$scope变量
需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...
-
在VS2012中采用C++中调用DLL中的函数 (4)
这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...
-
在C++中调用DLL中的函数
如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...
-
【原创】在VS2012中采用C++中调用DLL中的函数(4)
这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...
随机推荐
-
java基础学习02(简单的java程序)
简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...
-
ExpandableListView实现展开更多和收起更多
[需求]: 如上面图示 当点开某个一级菜单的时候,其他菜单收起: 子级菜单默认最多5个: 多于5个的显示"展开更多" 点击"展开更多",展开该级所有子级菜单,同 ...
-
【未完成0.0】Noip2012提高组day2 解题报告
第一次写一套题的解题报告,感觉会比较长.(更新中Loading....):) 题目: 第一题:同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一 ...
-
java Pattern
public class Test{ //匹配替换掉order by之后的字符串 public static void main(String[] args) { Pattern pattern = ...
-
1020. Tree Traversals (序列建树)
Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and i ...
-
MySQL的链接,查看数据库,使用数据库,查看表
MySQL的链接,查看数据库,使用数据库,查看表 mysql> show databases; +--------------------+ | Database | +------------ ...
-
JSP中两种模式的总结
运用JSP/Servlet实现的Web动态交互,主要采用: 模式一:JSP+JavaBean 链接:http://wxmimperio.coding.io/?p=155 模式二;JSP+Servlet ...
-
c 转置字符串You are a so cheap man ->;man cheap so a are You
解题思路: 1.将字符串转置 2.对转置后的字符串中单词转置 #include<stdio.h> #include<string.h> #include<stdlib.h ...
-
GoodReads: Machine Learning (Part 3)
In the first installment of this series, we scraped reviews from Goodreads. In thesecond one, we per ...
-
ionic3 在ios9.0 系统下 会出现ReferenceError:Can&#39;t find variable:Intl 错误提示
ionic3 框架开发app 在ios 9.0版本中 ReferenceError:Can't find variable:Intl 错误提示: 在index.html 文件中添加 <scri ...