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

Reading number is top 10 articles
C#程序的50种方法
XSL教程:了解基础知识关于XSL_[XML教程]
获取Web.Config文件中AppSetting_[Asp.Net教程]
ASP.NET,2.0中XSLT的使用_[Asp.Net教程]
在服务器端得到CheckBoxList控件最后选择项的方法_[Asp.Net教程]
使用,XSL,样式表无法查看,XML,输入_.net资料_编程技术
一些Select检索高级用法(适用于mssql)_[SQL,Server教程]
收集ASP转ASP.NET过程典型问题_[Asp.Net教程]
PHP+MYSQL实例:网站在线人数的程序代码_[PHP教程]
C#视频教程_[Asp.Net教程]
Reading number is top 10 pictures
29 the belle stars after bath figure3
The little girl with long hair1
A man's favorite things14
More attractive than sora aoi1
Sell the barbecue as says father du breul4
A beautiful girl to bud3
The money of more than 100 countries and regions19
水晶头骨造型的酒瓶
你是左脑型还是右脑型
Sexy women in 2013--1
Download software ranking
Call Of Duty2
The Bermuda triangle3
在线棋牌游戏3.05版
Proficient in JavaScript
White deer villiage
株洲本地在线棋牌游戏
The hero
Kung.Fu.Panda.2
美女写真2
Boxer Classic video1
delv published in(发表于) 2014/1/27 6:47:55 Edit(编辑)
ASP.NET中“找不到指定模块”的解决办法_[Asp.Net教程]

ASP.NET中“找不到指定模块”的解决办法_[Asp.Net教程]

ASP.NET中“找不到指定模块”的解决办法_[Asp.Net教程]

  最近继续用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.