现在接触一个需求,要使用一个网关接口实现短信发送,实现过程并不难,是使用[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,并且向上提供更多实用方法,设计模式中是叫接口模式。