各位 asp.net 同行 早上好,已经困扰我整整一个星期的问题,使我不得不在此寻求高人的指点:
问题描叙:
在我的asp.net项目中 我调用一个c++的dll库 用于完成一个机器码转换成序列号的功能,整个程序在 我自己的机器上(win7)测试(debug下和IIS下都测试过 )没有任何报错 均能正常执行 ,但是程序一放到服务器上去 就不能正确的执行了 下面给出错误信息 和我调用c++库的代码环节 希望各达人指点一二
出现以下错误:
值不能为空。
参数名: ptr
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.ArgumentNullException: 值不能为空。
参数名: ptr
源错误:
行 87: IntPtr pDll = LoadLibrary(dllpath);
行 88: IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "BuildRegisterKey");
行 89: BuildRegisterKey buildRegisterKey = (BuildRegisterKey)Marshal.GetDelegateForFunctionPointer( pAddressOfFunctionToCall, typeof(BuildRegisterKey));
行 90: IntPtr pAddressOfFunctionToCall1 = GetProcAddress(pDll, "CheckRegister");
行 91: CheckRegister checkRegister = (CheckRegister)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall1, typeof(CheckRegister));
源文件: e:\QuaoarSystem\WebMPOC\WebAdmin\Company\pocClientEdit.aspx.cs 行: 89
堆栈跟踪:
[ArgumentNullException: 值不能为空。
参数名: ptr]
System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(IntPtr ptr, Type t) +2727311
WebAdmin_Company_pocClientEdit.sumbit_Click(Object sender, EventArgs e) in e:\QuaoarSystem\WebMPOC\WebAdmin\Company\pocClientEdit.aspx.cs:89
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +105
System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +107
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +7
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +11
PSOA.Common.Pagebase.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +129
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1746
--------------------------------------------------------------------------------
版本信息: Microsoft .NET Framework 版本:2.0.50727.1433; ASP.NET 版本:2.0.50727.1433
调用部分源代码:
#region P/Invoke helpers 导入dll声明 [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllToLoad); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); [DllImport("kernel32.dll")] public static extern bool FreeLibrary(IntPtr hModule); #endregion protected void sumbit_Click(object sender, EventArgs e) { string dllpath = Server.MapPath("/") + "Bin\\RegEx.dll"; IntPtr pDll = LoadLibrary(dllpath); IntPtr pAddressOfFunctionToCall = GetProcAddress(pDll, "BuildRegisterKey"); BuildRegisterKey buildRegisterKey = (BuildRegisterKey)Marshal.GetDelegateForFunctionPointer( pAddressOfFunctionToCall, typeof(BuildRegisterKey)); IntPtr pAddressOfFunctionToCall1 = GetProcAddress(pDll, "CheckRegister"); CheckRegister checkRegister = (CheckRegister)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall1, typeof(CheckRegister)); try { qhcmodel.PocClientName = POCName.Text.Trim(); byte[] key = new byte[65]; byte[] code = Encoding.ASCII.GetBytes(Serial1.Text.Trim()); bool test = buildRegisterKey(22334455, code, key); FreeLibrary(pDll); //test = checkRegister(22334455, code, key); ASCIIEncoding encoding = new ASCIIEncoding(); this.Serial2.Text = encoding.GetString(key); key = null; qhcmodel.SerialNumber = Serial1.Text.Trim() + "|" + Serial2.Text.Trim(); qhc.Update(qhcmodel); if (code.Length != 16) { MPOC.Common.MessageBox.ShowAndRedirect(this.Page, "请注意:当前序列号不正确!", "pocClientAdmin.aspx"); } else { Response.Redirect("pocClientAdmin.aspx"); } } catch (Exception ex) { lbError.Text = "出错信息:" + ex.Message; } }
个人想法:
1.可能是因为IIS的权限设定导致.文件夹访问权限的问题..
请逐一排查一下.(服务器上应该是2003Server或者更高.)
很有可能是asp.net的运行身份aspnet或NetWork Service没有读取/修改注册表的权限。
你检查一下本地运行时有没有添加特殊的权限
或进行dll的注册如:regsvr32 /i Regex.dll等。
当然也可以尝试将该dll放到System32(COM)下或GAC(.net)中