c# webServices调用外部DLL的坑
作者:互联网
背景:
web项目中需要调用一个c++写的DLL,里面有一整套的算法,传入参数,输出结果。 DLL是跟一个加密狗有绑定的,其中部分参数是必须插入加密狗才能够访问。一共涉及到3个文件RYDLL32.DLL、Syxgbdll.h(这个文件到底有没有用,我也不太清楚)、Syxgbdynamic.dll。
用C#直接dllimport Syxgbdynamic.dll 这个文件,可以找到所有可用的方法,而这里面有些方法是Syxgbdynamic.dll 去调用RYDLL32.DLL 才能得到结果。
在winform里面写了一段程序调用,一直正常,但是迁移到Asp.net WebServices上的时候,就报各种错,提示有”找不RYDLL32.DLL“
在web服务下面,引用DLL的代码如下:
[DllImport("Syxgbdynamic.dll", EntryPoint = "chebiao", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern double chebiao(string bh_p, double oil_h, double water_h);
之后就一直报错,经过2天的尝试,终于在VS 和IIS都能正常访问,解决方案如下:
VS2015下正常访问:
1、如果是在VS中使用iisexpress作为web容器的情况下,将DLL拷贝到 C:\Program Files (x86)\IIS Express\ 的目录下
2、配置DLL的权限 给IIS_USER 和Network_Service 的用户权限
在IIS下的配置重点(win10 IIS10环境下):
解决这些问题的重点:
1、配置DLL的权限 给IIS_USER 和Network_Service 的用户权限
2、将DLL 拷贝到IIS程序exe的执行根目录中,位置C:\Windows\System32\inetsrv
3、发布到IIS后,应用程序池要改成 启用32位程序
4、C:\Windows\System32\inetsrv 【发现在代码里面申明了DLL import后,则会自动被IIS拷贝进去(如果没有,请手工拷贝)】
5、C:\Windows\SysWOW64\inetsrv 这是发布后需要拷贝DLL的地方,如果存在DLL之间的引用,则剩下的DLL需要放到这里。(在进程管理器中,找到w3wp.exe的所在位置)
总结:感觉Syxgbdynamic.dll 在调用RYDLL32.DLL内部算法的时候,其是由IIS的相关进程负责去驱动的,所有其RYDLL32.DLL则必须跟其exe执行程序放在一起。
本文抄袭 同事 刘神父
标签:调用,IIS,c#,RYDLL32,dll,webServices,DLL,Syxgbdynamic 来源: https://www.cnblogs.com/530263009QQ/p/10613808.html