You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
115 lines
3.7 KiB
115 lines
3.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
|
|
namespace EasyBL.DllDynamicCall
|
|
{
|
|
public class DllCall
|
|
{
|
|
private Assembly _assembly;
|
|
|
|
public Dictionary<string, object> Objects { get; set; }
|
|
|
|
public Dictionary<string, Dictionary<string, MethodInfo>> Methods { get; set; }
|
|
|
|
/// <summary>
|
|
/// 构造器
|
|
/// </summary>
|
|
/// <param name="dllPath">DLL绝对路径</param>
|
|
public DllCall(string dllPath)
|
|
{
|
|
LoadDll(dllPath);
|
|
|
|
Objects = new Dictionary<string, object>();
|
|
Methods = new Dictionary<string, Dictionary<string, MethodInfo>>();
|
|
}
|
|
|
|
#region 公开方法
|
|
|
|
/// <summary>
|
|
/// 注册要目标类
|
|
/// </summary>
|
|
/// <param name="classFullName">类的完全限定名</param>
|
|
/// <param name="objectName">指定的对象名</param>
|
|
/// <param name="constructorParaTypes">构造器参数类型</param>
|
|
/// <param name="constructorParas">构造器参数</param>
|
|
public void RegisterObject(string classFullName, string objectName, Type[] constructorParaTypes, object[] constructorParas)
|
|
{
|
|
var t = _assembly.GetType(classFullName, true, false);
|
|
|
|
var constructorInfo = t.GetConstructor(constructorParaTypes);
|
|
|
|
if (constructorInfo != null)
|
|
{
|
|
var targetObject = constructorInfo.Invoke(constructorParas);
|
|
|
|
if (!Objects.ContainsKey(objectName))
|
|
{
|
|
Objects.Add(objectName, targetObject);
|
|
}
|
|
if (!Methods.ContainsKey(objectName))
|
|
{
|
|
Methods.Add(objectName, new Dictionary<string, MethodInfo>());
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注册函数
|
|
/// </summary>
|
|
/// <param name="classFullName">类完全限定名</param>
|
|
/// <param name="objectName">制定函数所在对象名</param>
|
|
/// <param name="funcName">函数名</param>
|
|
public void RegisterFunc(string classFullName, string objectName, string funcName)
|
|
{
|
|
var t = _assembly.GetType(classFullName, true, false);
|
|
var method = t.GetMethod(funcName);
|
|
if (Methods.ContainsKey(objectName))
|
|
{
|
|
if (!Methods[objectName].ContainsKey(funcName))
|
|
{
|
|
Methods[objectName].Add(funcName, method);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 调用函数
|
|
/// </summary>
|
|
/// <param name="objectName">目标对象名</param>
|
|
/// <param name="funcName">函数名</param>
|
|
/// <param name="paras">参数表,没有参数则用null</param>
|
|
/// <returns></returns>
|
|
public object CallFunc(string objectName, string funcName, object[] paras)
|
|
{
|
|
var targetObjec = Methods[objectName];
|
|
var targetFunc = targetObjec[funcName];
|
|
const BindingFlags flag = BindingFlags.Public | BindingFlags.Instance;
|
|
var result = targetFunc.Invoke(Objects[objectName], flag, Type.DefaultBinder, paras, null);
|
|
return result;
|
|
}
|
|
|
|
#endregion 公开方法
|
|
|
|
#region 私有方法
|
|
|
|
/// <summary>
|
|
/// 加载DLL
|
|
/// </summary>
|
|
/// <param name="dllPath">DLL绝对路径</param>
|
|
private void LoadDll(string dllPath)
|
|
{
|
|
if (File.Exists(dllPath))
|
|
{
|
|
_assembly = Assembly.LoadFrom(dllPath);
|
|
}
|
|
else
|
|
{
|
|
throw new FileNotFoundException($"{dllPath} isn't exist!");
|
|
}
|
|
}
|
|
|
|
#endregion 私有方法
|
|
}
|
|
}
|