为ASP.NET“包装”外部调用DLL

2010-08-28 10:52:45来源:西部e网作者:

  现在接触一个需求,要使用一个网关接口实现短信发送,实现过程并不难,是使用[DllImport("*.dll")],但用ASP.NET调用别人写好的DLL还是头一次。看了一下COM和非托管代码的介绍,搞的云里雾里反而更不知道自己要什么了,还是亲自动手做一下就知道。

  这网关有一个实现的例子:

  程序代码

        [DllImport("MWGateway.dll")]//帐户登陆
        private static extern int MongateConnect(string ip, int port, string account, string pwd);
        [DllImport("MWGateway.dll")]//发送单向信息
        private static extern int MongateSendSms(int clientsock, string mobi, string note);
        [DllImport("MWGateway.dll")]//测试连接
        private static extern int MongateTestConn(int clientsock);
        [DllImport("MWGateway.dll")]//查询余额
        private static extern int MongateQueryBalance(int clientsocket);
        [DllImport("MWGateway.dll")]//查询使用   
        private static extern int MongateQueryUsed(int clientsocket);


  注意:以上代码是可以放在ASP.NET页面中直接运行的,但有个条件,就是那个MWGateway.dll文件得搞到%system32%目录中,放在bin中不行,会提示说找不到模块。

  这直接带来的问题是,没办法在服务器上部署,因为要服务器的%system32%中放入一个动态库是很难做到的。

  我查了一下,都说在ASP.NET2.0环境中是可以把DLL放在bin中的方式调用,但我实验失败了;如果是应用程序项目,要把DLL文件放在debug中,试了一下,确实可以。

  换个角度去实现它:我先写个类库项目,这个类的功能就是“解释”一下DLL中的方法,用ASP.NET调用这刚写的类库项目,就可以实现把DLL拷贝到Bin文件夹中完成调用了。在服务器上验证了一下,每个应用程序池都可以运行独立的DLL,并且互相无任何干扰。

  这种方式有点像某种“包装器”,和那个Runtime Callable Wrapper的思路近似。我的web应用程序的一部分可以连接到DLL,并且向上提供更多实用方法,设计模式中是叫接口模式。

关键词:ASP.NET

赞助商链接: