日期:2014-05-18  浏览次数:20420 次

ASP.NET网站如何调用动态链接库DLL
集成环境:vs2008(中文)
项目类型:asp.net网站
问题描述:
  首先我建了一个Win32 Dynamic-Link Library”工程
  内容很简单,在唯一的Count.cpp文件中定义count方法返回a+b的值,代码如下:
  extern "C" _declspec(dllexport)double _stdcall count(double a, double b);
  double _stdcall count(double a, double b)
  {
  return a+b;
  }
  编译后产生了Count.dll及Count.lib文件
   
  在asp.net网站中我想要实现的内容是,当Click页面上的Button,调用count方法返回计算结果
  请问在Default.aspx.cs中应该写?

描述补充:
  我在网上找过很多关于调用的方法,以下方法没有成功

  尝试方法一:
  将Count.dll及Count.lib文件拷贝到网站项目的Bin文件夹下面,
  在“网站”标签下选择“添加引用”,在“添加引用”对话框中的“浏览”选项卡中找到Count.dll文件
  结果跳出错误信息:未能添加对“G:\...\Count.dll”的引用,在组件中找不到类型库

  尝试方法二:
  public partial class _Default : System.Web.UI.Page 
  {
  [DllImport("Count.dll",EntryPoint = "count")]
  static extern double count(double a, double b);
   
  protected void Page_Load(object sender, EventArgs e)
  {
  }

  protected void Button1_Click(object sender, EventArgs e)
  {
  Label1.Text = "" + count(2,3);
  }
  }
  结果在click按钮之后浏览器跳至 异常信息提示页面,内容如下
  “/WebSite3”应用程序中的服务器错误。
  --------------------------------------------
  无法加载 DLL“Count.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)。 
  说明: 执行当前 Web 请求期间,出现未处理的异常。
  请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 
  异常详细信息: System.DllNotFoundException: 无法加载 DLL“Count.dll”: 找不到指定的模块。

  但是这个方法,如果是调用系统的动态链接库是可以的!例如
  public partial class _Default : System.Web.UI.Page 
  {
  protected void Page_Load(object sender, EventArgs e)
  {
  }

  [DllImport("user32.dll", EntryPoint = "MessageBoxA")]
  static extern int MsgBox(int hWnd, string msg, string caption, int type);
  protected void Button1_Click(object sender, EventArgs e)
  {
  MsgBox(0, " 这就是用 DllImport 调用 DLL 弹出的提示框哦! ", " 挑战杯 ", 0x30);
  }
  }

  尝试方法三:
  也有人说.dll文件需要注册,用“RegSvr32 路径\Count.dll”命令,但这个是根本无法注册的。
  警示信息:没有找到DullRegisterServer输入点,无法注册此文件

希望有高手指点以下给一段完整的代码或者具体的操作步骤。
非常感谢!

------解决方案--------------------
将Count.dll及Count.lib文件拷贝到网站项目的Bin文件夹下面或System32下面
[DllImport("Count.dll",EntryPoint = "count")]
 static extern double count(double a, double b);

 protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = "" + count(2,3);
}