一、新建一调用工程项目和一个要测试的类项目,首先设计好测试的类以及函数,然后编译生成对应的类名.DLL文件。然后复制到调用工程项目的BIN目录下。
二、在调用工程项目中新建一WINFORM窗体,工具箱中拉一个按钮到窗体,然后在按钮事件中写调用代码
//调用办法
private void button1_Click(object sender, EventArgs e)
{
//调用办法
DllManager myDllManager = new DllManager();
//输出结果
Console.Write(myDllManager.Invoke("你的DLL文件名.dll","命名空间名称","类名","函数名",null));
// 卸载 DLL
myDllManager.UnLoadDll();
}
三、动态调用DLL的类文件如下:
//添加引用
using System.IO;
using System.Reflection;
public class DllManager
{
private static Assembly MyAssembly;// 记录要导入的程序集
/// <summary>
/// 调用指定DLL中的指定类的指定函数
/// </summary>
/// <param name="lpFileName">DLL文件名或者路径</param>
/// <param name="Namespace">DLL中的命名空间</param>
/// <param name="ClassName">中的命名空间中的类</param>
/// <param name="lpProcName">类中的方法</param>
/// <param name="ObjArray_Parameter">方法参数</param>
/// <returns></returns>
public object Invoke(string lpFileName, string Namespace, string ClassName, string lpProcName, object[] ObjArray_Parameter)
{
try
{// 判断 MyAssembly 是否为空或 MyAssembly 的命名空间不等于要调用方法的命名空间,如果条件为真,就用 Assembly.Load 加载所需 DLL 作为程序集
if (MyAssembly == null || MyAssembly.GetName().Name != Namespace)
MyAssembly = Assembly.Load(LoadDll(lpFileName));
Type[] type = MyAssembly.GetTypes();
foreach (Type t in type)
{
if (t.Namespace == Namespace && t.Name == ClassName)
{
MethodInfo m = t.GetMethod(lpProcName);
if (m != null)
{// 调用并返回
object o = Activator.CreateInstance(t);
return m.Invoke(o, ObjArray_Parameter);
}
else
System.Windows.Forms.MessageBox.Show(" 装载出错 !");
}
}
}
catch (System.NullReferenceException e)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
return (object)0;
}
/// <summary>
/// 加载DLL文件
/// </summary>
/// <param name="lpFileName">DLL文件名或者路径</param>
/// <returns></returns>
private byte[] LoadDll(string lpFileName)
{
Assembly NowAssembly = Assembly.GetEntryAssembly();
Stream fs = null;
try
{// 尝试读取资源中的 DLL
fs = NowAssembly.GetManifestResourceStream(NowAssembly.GetName().Name + "." + lpFileName);
}
finally
{// 如果资源没有所需的 DLL ,就查看硬盘上有没有,有的话就读取
if (fs == null && !File.Exists(lpFileName)) throw (new Exception(" 找不到文件 :" + lpFileName));
else if (fs == null && File.Exists(lpFileName))
{
FileStream Fs = new FileStream(lpFileName, FileMode.Open);
fs = (Stream)Fs;
}
}
byte[] buffer = new byte[(int)fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
return buffer; // 以 byte[] 返回读到的 DLL
}
public void UnLoadDll()
{
// 使 MyAssembly 指空
MyAssembly = null;
}
}
//上述代码是网站搜集的。已经测试过自己的数据库操作DLL文件。没有问题,希望能方便到大家。
分享到:
相关推荐
1.C#调用C++封装的动态库dll 2.结构体含union共同体的C++转C#示例 3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装...
JS调用c#编写的DLL 源代码 包含c#新建类库,生成DLL,以及DLL的注册 ,JS调用DLL的两种方法的整个过程。
C#动态载入DLL,DLL中类方法调用,及采用接口方式调用DLL的类方法和获取类成员属性。含示例代码及程序运行截图。
c#开发框架下调用c++开发的dll动态库,实现跨语言开发功能。
c#调用c++ dll 传参 string 崩溃的一种解决办法
资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。
C#调用DLL函数方法: 介绍了C#下调用dll的方法和代码示例
用C++调用C#实例代码,C#封装为DLL。
Pb调用 c#编写的DLL的方法 C#以其简单易用,功能强大深受大家喜爱.PowerBuilder作为C/S的MIS开发工具,十分简单灵活,开发时间短,开发及维护成本低,一直是中小企业信息管理系统的首选开发工具.但是PB的局限性限制了它...
DLL动态链接库调用C#源代码DLL动态链接库调用C#源代码DLL动态链接库调用C#源代码
C#调用C++代码 描述说明:http://blog.csdn.net/qiuhua1231232006/article/details/56277338
"C# 如何调用 VB6.0 编写的 dll" 在本文中,我们将探讨如何在 C# 项目中调用 VB6.0 编写的 ...本文中,我们讨论了如何在 C# 项目中调用 VB6.0 编写的 dll,并提供了一个简单的示例代码,以便读者更好地理解这个技术。
底层函数用c++开发,提高安全性与性能。顶层代码用c#开发,方便易用。
可以在C#中为Visual foxpro 编写可以调用的DLL 文件。本例提供了一个范例,代码可以扩展。
为了能用上原来的C++代码,只好研究下从C# 中调用DLL 首先必须要有一个声明,使用的是DllImport关键字: 包含DllImport所在的名字空间 using System.Runtime.InteropServices; public class XXXX{ [DllImport(...
在visual C# 中调用 DLL 源代码
C++调用C#的DLL实例程序,压缩包中包含部分程序说明,很小的几行代码,但是C++调用C#的DLL目的已经达到。
C#dll的调用 dll源代码 动态链接库 dll动态链接 C#动态链接库
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL。 SwfDotNet是.net下输出flash的类库。SwfDotNet是C#编写的,作者的C#水平,真是令我佩服。这是个特别好的读写Swf文件的库。但是,我要用在C++项目...
C++调用C#dll,采用的VS2010编写的。具体的看代码,比较易懂。