实例 DLL类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class TestDll
{
private string strName;
public TestDll()
{
//
// TODO: Add constructor logic here
//
strName = "";
}
public string GetValue( int nCount )
{
return string.Format( "Count is {0}!", nCount );
}
public static string GetNewValue( int nCount )
{
return string.Format( "New count is {0}!", nCount );
}
public string Name
{
get{ return strName;}
set{ strName = value;}
}
}
}
---------------------------------------------------------------
调用DLL的类 (把DLL拷贝到debug目录,执行以下的代码)
static void Main(string[] args)
{
//参数
// name
// 类型:System.String
// String,它包含要调用的构造函数、方法、属性或字段成员的名称。
// - 或 -
// 空字符串 (""),表示调用默认成员。
// - 或 -
// 对于 IDispatch 成员,则为一个表示 DispID 的字符串,例如“[DispID=3]”。
// invokeAttr
// 类型:System.Reflection..::.BindingFlags
// 一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将使用 BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static。
// binder
// 类型:System.Reflection..::.Binder
// 一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。
// - 或 -
// 若为 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing),则使用 DefaultBinder。请注意,为了成功地使用变量参数来调用方法重载,可能必须显式定义 Binder 对象。
// target
// 类型:System..::.Object
// 要在其上调用指定成员的 Object。
// args
// 类型:array<System..::.Object>[]()[]
// 包含传递给要调用的成员的参数的数组。
// 返回值
// 类型:System..::.Object
// 表示被调用成员的返回值的 Object。
// Load assembly from dll file
Assembly assembly = Assembly.LoadFrom("ClassLibrary1.dll");
// Create new type
Type t = assembly.GetType("ClassLibrary1.TestDll");
// Call static member function by name
string strReturn = (string)t.InvokeMember("GetNewValue",
BindingFlags.DeclaredOnly |
BindingFlags.Public |
BindingFlags.Static | BindingFlags.InvokeMethod,
null,
null,
new object[] { 12 });
Console.WriteLine(strReturn);
// Create new object of specific class name
//非静态属性和方法的调用方式
Object obj = t.InvokeMember(
null,
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance,
null,
null,
null);
// Call member function by name
strReturn = (string)t.InvokeMember("GetValue",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.InvokeMethod,
null,
obj,
new object[] { 12 });
Console.WriteLine(strReturn);
// Set class property
t.InvokeMember("Name",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.SetProperty,
null,
obj,
new Object[] { "Test" });
// Get class property
strReturn = (string)t.InvokeMember("Name",
BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.GetProperty,
null,
obj,
null);
Console.WriteLine(strReturn);
Console.ReadLine();
}