C Sharp与.net学习笔记(二)
来源:互联网 发布:任我行crm 知乎 编辑:程序博客网 时间:2024/06/06 17:46
看看动态库创建与使用相关的东西
生成与使用(托管的)dll
dll.cs ==> dll.dll
// file: dll.cspublic class Calc{ public static int Add(int a, int b) { return a + b; }}
main.cs ==> main.exe
// file: main.csusing System;class App{ public static void Main() { Console.WriteLine("{0} + {1} = {2}", 123, 456, Calc.Add(123, 456)); }}
编译:
E:\> csc /target:library dll.csE:\> csc /reference:dll.dll main.cs
运行:
E:\> main123 + 456 = 579
动态加载dll
using System;using System.Reflection;class App{ public static void Main() { Assembly dll = Assembly.Load("dll"); Type calcType = dll.GetType("Calc"); object[] parameters = new object[]{123, 456}; object res = calcType.InvokeMember("Add2", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, parameters); Console.WriteLine("{0} + {1} = {2}", 123, 456, (int)res); }}
- 首先,加载我们动态库dll.dll,使用的Assembly.Load,也可以用(相对或绝对路径)
Assembly.LoadFrom("dll.dll");
- 然后,获取需要的类型,存于calcType
最后通过InvokeMember调用该类型中的成员函数。如果调用的不是static成员,还需要创建该类型的实例
Object obj = Activator.CreateInstance(calcType); object res = calcType.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, parameters);
另一种写法:
MethodInfo addMethod = calcType.GetMethod("Add"); object[] parameters = new object[]{123, 456}; object obj = Activator.CreateInstance(calcType); object res = addMethod.Invoke(obj, parameters);
使用非托管 dll
dll2.cpp ==> dll2.dll
// file: dll2.cppextern "C" int __declspec(dllexport) Add(int a, int b){ return a + b;}
main.cs ==> main.exe
// file: main.csusing System;using System.Runtime.InteropServices;class App{ [DllImport("dll2.dll")] public static extern int Add(int a, int b); public static void Main() { Console.WriteLine("{0} + {1} = {2}", 123, 456, Add(123, 456)); }}
编译运行:
E:\> cl dll2.cpp /LDE:\> csc main.csE:\> main123 + 456 = 579
这个东西被称为Platform Invoke(P/Invoke). DllImport还有一些属性
EntryPoint
CharSet
CallingConvention
SetLastError
[DllImport("dll2.dll", EntryPoint="Add", CharSet=CharSet.Auto, CallingConvention=CallingConvention.Winapi, SetLastError=true)]
动态加载dll
这又需要回到Win32 Api函数LoadLibrary、FreeLibrary这些东西了
// file: main.csusing System;using System.Runtime.InteropServices;class App{ [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dllFileName); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr dllHandle, string functionName); [DllImport("kernel32.dll")] public static extern bool FreeLibrary(IntPtr dllHandle); private delegate int AddDelegate(int a, int b); public static void Main() { IntPtr handle = LoadLibrary("dll2.dll"); IntPtr pAddFunc = GetProcAddress(handle, "Add"); AddDelegate Add = (AddDelegate)Marshal.GetDelegateForFunctionPointer( pAddFunc, typeof(AddDelegate)); Console.WriteLine("{0} + {1} = {2}", 123, 456, Add(123, 456)); FreeLibrary(handle); }}
先用P/Invoke把这3个函数弄进来,然后用它们去处理我们要动态加载的动态库。
直接编译
E:\> csc main.cs
- C Sharp与.net学习笔记(二)
- C Sharp与.net学习笔记(一)
- C Sharp与.net学习笔记(三)
- C Sharp与.net学习笔记(四)
- c sharp学习笔记1
- c sharp学习笔记2
- C sharp 学习笔记 --- 初识C sharp 一星期
- C sharp 泛型 lambda表达式学习笔记
- ASP.Net 3.5学习笔记(C#)二
- C Sharp 入门(二)变量
- 【笔记】Beginning C Sharp 2008 Objects
- 【笔记】Beginning C Sharp 2008 Objects
- c sharp
- C#(Sharp)
- c sharp 菜鸟的学习历程
- c sharp 菜鸟的学习历程2
- c sharp 菜鸟的学习历程3
- c sharp 菜鸟的学习历程4
- DELPHI关于文件流
- 跟KingDZ学HTML5之十二 HTML5 Form 表单元素新增属性
- 使用Java提供的方法防止IE缓存JSP文件
- AJAX技术基础__Ajax技术文档
- 动态网页静态化(asp.net-html)
- C Sharp与.net学习笔记(二)
- 快速学习AJAX之一
- Ajax最简单实例(加法运算)
- javascript实现继承的方法
- Java安装方法
- NHibernate翻译文档提供下载(chm和html格式)
- C Sharp与.net学习笔记(三)
- 以前的 Delphi
- 使用Delphi压缩Access