首页 新闻 搜索 专区 学院

ASP.net 调用c++dll 服务器运行出错 不得解

1
悬赏园豆:100 [已关闭问题]

各位 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

调用部分源代码:

C# code
#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; } }
MerrySoft的主页 MerrySoft | 初学一级 | 园豆:100
提问于:2009-09-20 16:32
< >
分享
其他回答(1)
0

个人想法:

1.可能是因为IIS的权限设定导致.文件夹访问权限的问题..

   请逐一排查一下.(服务器上应该是2003Server或者更高.) 

  

独奏 | 园豆:225 (菜鸟二级) | 2009-09-20 21:49
0

很有可能是asp.net的运行身份aspnet或NetWork Service没有读取/修改注册表的权限。

你检查一下本地运行时有没有添加特殊的权限

或进行dll的注册如:regsvr32 /i Regex.dll等。

当然也可以尝试将该dll放到System32(COM)下或GAC(.net)中

邀月 | 园豆:25475 (高人七级) | 2009-09-21 08:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册