装载外部DLL 全攻略 [转:]

原创 2004年08月06日 00:36:00

using System;
using System.Windows.Forms;

namespace ArLi.CommonPrj {
 public class ShowAboutBox {
  public static void ShowOn(Form fm) {
   MessageBox.Show("OK");
  }
 }
}

编译后文件名叫 AboutBox.dll

主程序里调用方法如下:

//定义文件名
FileInfo aBoxFile = new FileInfo(Path.Combine(Application.StartupPath,"AboutBox.dll"));

if (aBoxFile.Exists) { //如果存在
 try { //预防意外,比如不载不完整,非法DLL
  // 开始载入
  Assembly aBox = Assembly.LoadFrom(aBoxFile.FullName); 
  Type[] _t = aBox.GetTypes(); //获得全部Type
  foreach (Type t in _t) { //遍历
   //如果发现名称空间和类名有相符的
   if (t.Namespace == "ArLi.CommonPrj" && t.Name == "ShowAboutBox") {
    //载入方法
    MethodInfo m = t.GetMethod("ShowOn");
    if (m != null) { //如果要载入的方法存在
     //创建实例
     object o = Activator.CreateInstance(t);
     //执行该方法,后面的this 是参数
     m.Invoke(o,new object[]{this});
    }
    else { //载入的方法不存在
     MessageBox.Show("File /"AboutBox.dll/" Invalid!/n/nMethod Error.");
    }
    return;
   }
  }
  MessageBox.Show("File /"AboutBox.dll/" Invalid!/n/nAssembly Name Error.");
 } //文件、命名空间、方法都相符,但执行该DLL 内容出错
 catch (System.NullReferenceException ex) {
  MessageBox.Show("File /"AboutBox.dll/" Invalid!");
 } //文件非正常DLL
 catch (Exception ex) {
  MessageBox.Show("File /"AboutBox.dll/" Error: /n/n" + ex.Message);
 }
}
else { //文件没找到
 MessageBox.Show("File /"AboutBox.dll/" Missing!");
}

说明1: 如果直接用 type t = gettype("arli.comm...") 这样也可以但如果此class 不存在就会出Exception
说明2:这种逆向反射动态载入无需定义装配件信息
说明3:此方法已经最大程度的进行了潜在的检测,除非非合法的WinDLL(比如下载的不完整),否则不会进入到很慢的 try catch

装载外部DLL 全攻略

例DLL 文件内容如下:using System;using System.Windows.Forms;namespace ArLi.CommonPrj { public class ShowAbou...
  • ArLi2003
  • ArLi2003
  • 2003年09月15日 09:27
  • 855

SQL 无法装载DLL Microsoft原因

无法装载DLL Microsoft原因: 126(找不到指定的模块)。U890帐套引入提示:“无法装载 DLL Microsoft提示您请误随意操作SQL数据库 以免对起  数据库造成不必要的麻烦 或...
  • dxw122
  • dxw122
  • 2011年03月21日 21:14
  • 3976

装载外部DLL

例DLL 文件内容如下:using System;using System.Windows.Forms;namespace wantsfly.com{ public class ShowAboutBo...
  • wantsfly
  • wantsfly
  • 2005年08月26日 16:27
  • 611

无法装载DLL Microsoft提示请误随意操作SQL数据库,以免对数据库造成不必要的麻烦或DLL所引用的某一DLL。原因:126(找不到指定模块)

之前曾经遇到过这个问题,但都是卸载后再重新安装解决的;今天查了半天资料,走运的把这个问题解决了;这种情况由于SQL2000的SA密码过于简单导致,被病毒恶意修改系统存储过程(master里面的扩展存储...
  • tzj19810812
  • tzj19810812
  • 2011年03月07日 17:07
  • 2460

vs2012延迟加载dll

参考自windows核心编程第五版20.3延迟加载DLL 一:编译 20-DelayLoadLib.dll和20-DelayLoadLib.lib 二:将20-DelayLoadLib.dll...
  • u012410612
  • u012410612
  • 2013年10月15日 13:02
  • 1028

加载dll以及卸载dll相关的几个API

普及一下知识: (1)LoadLibrary函数将指定的DLL模块加载到进程的地址空间中。 调用成功,返回指定DLL文件的句柄,DLL句柄用来标识一个DLL文件。 调用失败,返回NU...
  • u012964993
  • u012964993
  • 2014年11月05日 14:22
  • 1451

非常不错的C#动态调用DLL代码

一、新建一调用工程项目和一个要测试的类项目,首先设计好测试的类以及函数,然后编译生成对应的类名.DLL文件。然后复制到调用工程项目的BIN目录下。   二、在调用工程项目中新建一WINFORM窗体...
  • xqf222
  • xqf222
  • 2012年09月15日 23:49
  • 2598

40、C#:如何调用外部dll的接口

.如果要用别人dll中的接口,以此来调用别人的服务(别人的服务必须是开启的,而且要能通过expo服务调用到),应该如何做? 1.首先将别人的dll引用到自己的项目中来(添加引用即可) 2.然后将别人的...
  • xushaozhang
  • xushaozhang
  • 2017年11月23日 20:54
  • 230

C++ DLL编程时报错:无法解析的外部符号

问题: 1 error LNK2001: 无法解析的外部符号 _xMonitorFromPoint@12 e:\visual studio 2010\Projects\myTest\ModifyR...
  • hchyboy
  • hchyboy
  • 2017年05月18日 15:04
  • 1130

oracle调用外部C DLL

什么是外部程序?一个外部程序是存储在一个动态链接库(DLL)中的第三代语言程序,使用PL / SQL注册,并通过你叫做特殊处理。该例程必须从C调用,但可以用任何语言编写。在运行时,PL / SQL动态...
  • lly276586465
  • lly276586465
  • 2017年10月13日 16:05
  • 204
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装载外部DLL 全攻略 [转:]
举报原因:
原因补充:

(最多只允许输入30个字)