在C#中可以通过Assembly来动态加载DLL,然后由它创建类型,接着通过类型的InvokeMember方法来调用DLL中类的方法以及属性。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
为了方便说明一下的方法,先说明一下DLL的代码,大致如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
using System;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
namespace clsTestDll
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// Summary description for TestDll.
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
/// </summary>
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public class TestDll
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
private string strName;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public TestDll()
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
// TODO: Add constructor logic here
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
//
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
strName = "";
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string GetValue( int nCount )
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return string.Format( "Count is {0}!", nCount );
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public static string GetNewValue( int nCount )
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return string.Format( "New count is {0}!", nCount );
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
public string Name
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return strName;}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ strName = value;}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
大致的步骤如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
首先加载DLL,具体如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Load assembly from dll file
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Assembly assembly = Assembly.LoadFrom( "clsTestDll.dll");
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
其次,用加载的assembly来定义指定的类型,例如:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Create new type
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Type t = assembly.GetType( "clsTestDll.TestDll");
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
然后就可以通过新建的类型来调用类的方法。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果是类的静态方法,可以直接调用,如:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Call static member function by name
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
string strReturn = (string) t.InvokeMember("GetNewValue",
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.DeclaredOnly |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Public |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Static | BindingFlags.InvokeMethod,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
new object[]
{ 12 } );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
如果是类的非静态方法或属性,则需要通过类型,先生成类的对象,如:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Create new object of specific class name
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
Object obj = t.InvokeMember(
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.DeclaredOnly |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Public | BindingFlags.NonPublic |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Instance | BindingFlags.CreateInstance,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
接着,就可以通过“obj”对象来进行调用了,如:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Call member function by name
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
strReturn = (string) t.InvokeMember("GetValue",
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.DeclaredOnly |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Public | BindingFlags.NonPublic |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Instance | BindingFlags.InvokeMethod,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
obj,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
new object[]
{ 12 } );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Set class property
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
t.InvokeMember("Name",
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.DeclaredOnly |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Public | BindingFlags.NonPublic |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Instance | BindingFlags.SetProperty,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
obj,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
new Object[]
{"Test"} );
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
// Get class property
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
strReturn = (string) t.InvokeMember("Name",
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.DeclaredOnly |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Public | BindingFlags.NonPublic |
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
BindingFlags.Instance | BindingFlags.GetProperty,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
obj,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
null);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
posted @
2009-11-12 15:06
弹着钢琴设计
阅读(
1767)
评论()
编辑
收藏
举报