.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("要解密内容","密码")   //   解密 

在ASP中调用DLL的方法的更多相关文章

  1. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  2. 在C++中调用DLL中的函数 (3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  3. Unity中调用DLL库

    DLL -- Dynamic Link Library(动态链接库文件),这里以Window平台为例. Unity支持的两种语言生成的DLL库(C++.C#),这里以C#为例,C++网上可以搜索很详细 ...

  4. 在C++中调用DLL中的函数(3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  5. C#中调用Dll动态链接库

    C#中调用Dll动态链接库 起始 受限于语言的不同,我们有的时候可能会用别人提供的函数及方法 或者其他的什么原因.反正就是要调!!! 恰巧别人所使用的的语言跟自己又不是一样的 这个时候想要调用别人的函 ...

  6. JavaScript文件中调用AngularJS内部方法或改变$scope变量

    需要在其他JavaScript文件中调用AngularJS内部方法或改变$scope变量,同时还要保持双向数据绑定: 首先获取AngularJS application: 方法一:通过controll ...

  7. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  8. 在C++中调用DLL中的函数

    如何在C++中调用DLL中的函数 应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下 ...

  9. 【原创】在VS2012中采用C++中调用DLL中的函数(4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

随机推荐

  1. 小细节:Java中split()中的特殊分隔符 小数点

    这两天做项目过程中由于数据表字段设计的太恶心了,导致自己填坑 关于微信支付和支付宝的支付有一个不同点:就是金额的处理,支付宝金额的单位是0.01元,但是微信支付中1表示0.01元,当时设计价格的时候使 ...

  2. Java项目中使用配置文件配置

    private String readConfig() { Properties p = new Properties(); InputStream in = getClass().getClassL ...

  3. 有关DOM的小总结

    一直以为DOM(文档对象模型)是JS中最简单的一部分.不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起 ...

  4. Hibernate(三)Hibernate 配置文件

    在上次的博文Hibernate(二)Hibernate实例我们已经通过一个实例的演示对Hibernate 的基本使用有了一个简单的认识,这里我们在此简单回顾一下Hibernate框架的使用步骤. Hi ...

  5. bzoj 1096 [ZJOI2007]仓库建设(关于斜率优化问题的总结)

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3234  Solved: 1388[Submit][Stat ...

  6. margin设置为负数

    1.为负margin“平反” 我们在CSS中都会使用margin,但将margin设置成负数,那可能就不大好处理了.在网页设计中,人们对负margin用法的态度大相径庭,有的人非常喜欢,而有的人则认为 ...

  7. 2013=7=29 nyist 13题

    Fibonacci数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 无穷数列1,1,2,3,5,8,13,21,34,55...称为Fibonacci数列,它可以递归地 ...

  8. c++函数模板声明与定义相分离

    最近在仿写stl,发现stl源码中将模板的声明与定义写在一起实在很不优雅.自己尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义,然后在main函数里包含.h头文件,这样会报链接错误.这是因 ...

  9. 详解集群内Session高可用的实现原理

    在这个互联网高度发达的时代,许多应用的用户动辄成百上千万,甚至上亿.为了支持海量用户的访问,应用服务器集群这种水平扩展的方式是最常用的.这种情形下,就会涉及到许多单机环境下完全不需要考虑的问题,这其中 ...

  10. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...