装载外部DLL 全攻略

原创 2003年09月15日 09:27:00

例DLL 文件内容如下:

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

java中调用本地动态链接库(*.DLL)的两种方式详解和not found library、打包成jar,war包dll无法加载等等问题解决办法

我们经常会遇到需要java调用c++的案例,这里就java调用DLL本地动态链接库两种方式,和加载过程中遇到的问题进行详细介绍 1、通过System.loadLibrary("dll名称,不需要后缀...
  • eguid_1
  • eguid_1
  • 2016年09月14日 09:42
  • 4129

VS2010如何创建DLL和如何使用外部DLL

一、创建DLL: 1、创建DLL项目。这个太简单了,按着选项选没什么好说的。 2、导出lib 方式一: 头文件顶头: #ifdef DLL_EXPORTS (此处在项目预...
  • abc86319253
  • abc86319253
  • 2014年03月23日 21:33
  • 3847

C# 调用外部dll

http://www.cnblogs.com/kevin-top/archive/2010/06/04/1751425.html 一、      DLL与应用程序 动态链接库(也称为D...
  • u014683488
  • u014683488
  • 2016年07月11日 23:43
  • 2149

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

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

c++中使用外部库exe,.dll与.lib文件的生成与使用的详解

两种库: •  包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 •  包含函数代码本身,在...
  • jiangbingbo123
  • jiangbingbo123
  • 2016年04月04日 21:22
  • 1249

windows dll 装载过程

windows dll 装载过程 2010-12-04 19:13:56 分类:            Windows系统平台上,你可以将独立的程序模块创...
  • linuxheik
  • linuxheik
  • 2013年04月18日 14:53
  • 596

Unity 调用外部DLL插件

unity调用DLL
  • pool611
  • pool611
  • 2016年04月22日 14:47
  • 1366

C#中的委托(为什么C#调用dll的回调函数用委托)

简介        委托是C#中的一种引用类型,类似于C/C++中的函数指针。与函数指针不同的是,委托是面向对象、类型安全的,而且委托可以引用静态方法和实例方法,而函数指针只能引用静态函数。委托...
  • Rambo_WangNo1
  • Rambo_WangNo1
  • 2014年06月30日 18:06
  • 1026

遇到Qt调用dll问题(整理版)

(younghz)遇到Qt调用dll问题,search后整理如下: 首先列出几种错误,然后介绍解决方法。      (younghz后加:正确格式应该在-L和-l之后没有空格--14....
  • u012150179
  • u012150179
  • 2013年10月06日 14:51
  • 18166

GP中外部表数据装载

CREATE EXTERNAL TABLE ext_expenses  ( name text, date date,  amount float4, description text ) LOC...
  • learning_oracle_lh
  • learning_oracle_lh
  • 2016年01月08日 18:49
  • 1391
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:装载外部DLL 全攻略
举报原因:
原因补充:

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