All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
PHP中使用crypt()实现用户身份验证_php资料_编程技术
在使用ASP.NET网站管理工具出现“遇到错误。请返回上一页并重试。”的解决办法!_[Asp.Net教程]
动态网页制作技巧PHP:详细彻底学习Smarty_[PHP教程]
ASP.NET技巧:HTTP性能调优之设置连接失效时间_.net资料_编程技术
列出SQL,SERVER中的表_mssql学习_编程技术
C#如何把html中的相对路径变成绝对路径_[Asp.Net教程]
实现ASP.NET生成随机密码功能_[Asp.Net教程]
Response.Redirect,打开新窗口的两种方法_[Asp.Net教程]
MYSQL中如何设列的默认值为Now()_mssql学习_编程技术
学习PHP:详解mysql4.0以后的编码配置_php资料_编程技术
Reading number is top 10 pictures
29 the belle stars after bath figure4
Magnificent cloud2
NeedWallpaper10
From China fortress sora aoi3
寒流来了
The beginning and end
NeedWallpaper11
徐若瑄展示美丽胸围1
八个盛产美女的国家1
The money of more than 100 countries and regions20
Download software ranking
虚拟机5.5.3版
Jinling thirteen stock
Tram sex maniac 2 (H) rar bag14
Tram sex maniac 2 (H) rar bag15
matrix2
传奇私服架设教程-chm
XML+Web+Service开发教程
C#高级编程(第4版)
Boxer's Top ten classic battle3
Unix video tutorial9
aaa published in(发表于) 2013/12/18 7:54:41 Edit(编辑)
ASP.NET中“找不到指定模块”的解决办法_.net资料_编程技术

ASP.NET中“找不到指定模块”的解决办法_.net资料_编程技术

ASP.NET中“找不到指定模块”的解决办法_.net资料_编程技术-你的首页-uuhomepage.com

  最近继续用ASP.Net来重新开发ACM的Online Judge系统,因为要进行进程的监控,所以自己编写了一个非托管的DLL供ASP.Net调用。


  我用的是VS2005的开发环境,后来发现使用[DllImport("Judge.dll")]后提示 无法加载 DLL “Judge.dll” 找不到指定的模块!我这时就把Judge.dll拷贝到Bin目录下,但仍然提示找不到DLL,在工程里添加DLL引用的时候,发现添加这个非托管DLL就会令VS2005异常退出(上网搜索后也发现有人有相同的问题)。


  后来发现用[DllImport(@"C:\OJ\Bin\Judge.dll")]这样指定DLL的绝对路径就可以正常装载。


  这里还有一个解决办法.http://forums.asp.Net/thread/1121085.aspx


  这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下:


  首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理会比较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了.


  具体做法如下:


  首先我们在服务器上随便找个地方新建一个目录,假如为C:\DLL


  然后,在环境变量中,给Path变量添加这个目录


  最后,把所有的非托管文件都拷贝到C:\DLL中.


  或者更干脆的把DLL放到system32目录


  对于可以自己部署的应用程序,这样未偿不是一个解决办法,然而,如果我们用的是虚拟空间,我们是没办法把注册PATH变量或者把我们自己的DLL拷到system32目录的。同时我们也不一定知道我们的Dll的物理路径。


  DllImport里面只能用字符串常量,而不能够用Server.MapPath(@"~/Bin/Judge.dll")来确定物理路径。


  经过一翻研究,终于想到了一个完美的解决办法。


  首先我们用


  [DllImport("kernel32.dll")]
  private extern static IntPtr LoadLibrary(String path);
  [DllImport("kernel32.dll")]
  private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
  [DllImport("kernel32.dll")]
  private extern static bool FreeLibrary(IntPtr lib);


  分别取得了LoadLibrary和GetProcAddress函数的地址,再通过这两个函数来取得我们的DLL里面的函数。


  我们可以先用Server.MapPath(@"~/Bin/Judge.dll")来取得我们的DLL的物理路径,然后再用LoadLibrary进行载入,最后用GetProcAddress取得要用的函数地址。


  以下是自定义类的代码完成LoadLibrary的装载和函数调用:


public class DllInvoke
  {
  [DllImport("kernel32.dll")]
  private extern static IntPtr LoadLibrary(String path);
  [DllImport("kernel32.dll")]
  private extern static IntPtr GetProcAddress(IntPtr lib, String funcName);
  [DllImport("kernel32.dll")]
  private extern static bool FreeLibrary(IntPtr lib);
  private IntPtr hLib;
  public DllInvoke(String DLLPath)
  {
  hLib = LoadLibrary(DLLPath);
  }
  ~DllInvoke()
  {
  FreeLibrary(hLib);
  }
  //将要执行的函数转换为委托
  public Delegate Invoke(String APIName,Type t)
  {
  IntPtr api = GetProcAddress(hLib, APIName);
  return (Delegate)Marshal.GetDelegateForFunctionPointer(api,t);
  }
  }


  用下面代码进行调用


  public delegate int Compile(String command, StringBuilder inf);//编译
  DllInvoke dll = new DllInvoke(Server.MapPath(@"~/Bin/Judge.dll"));
  Compile compile = (Compile)dll.Invoke("Compile", typeof(Compile));
  StringBuilder inf;
  compile(@“gcc a.c -o a.exe“,inf); //这里就是调用我的DLL里定义的Compile函数





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.