在C#里怎么显式的加载DLL?
如题,就像在VC中LoadLibrary方法一样,C#应该如果做?
我要将一个DLL在内存中加载多次,以满足多线程的要求
问题点数:20、回复次数:12Top
1 楼WangGuangJun(雪山飞狐)回复于 2006-03-14 14:57:24 得分 10
Assembly asm = Assembly.LoadFrom("MyDll.dll");
Type[] ts = asm.GetTypes();
foreach (Type t in ts)
{
if (t.IsClass)
{
if (t.Name == "myClassName")
{
object obj = t.InvokeMember(null,
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
((Form)obj).Show();
}
}
}Top
2 楼visualhuman(游荡的指针)回复于 2006-03-14 15:38:25 得分 0
我的DLL是Win32的API,以前是用DllImport加载的,但好像是隐式加载,都加载到了一块内存中,由于DLL涉及TCP/IP的同步通信,多线程调用事会有问题Top
3 楼kingdomgps(工作没激情)回复于 2006-03-14 15:58:22 得分 0
mark,学习,我也只知道用DllImportTop
4 楼kingdomgps(工作没激情)回复于 2006-03-14 16:01:29 得分 0
突然想到二楼的方法行啊。
首先自己封装WinAPI,然后再使用二楼提供的办法动态装载自己封装的DLL
不知道行不,哈哈Top
5 楼lidong6(立冬)回复于 2006-03-14 16:12:14 得分 0
可以,但是要先用C#封装一层(添加引用时IED会自动完成类型导入)再使用动态加载Top
6 楼visualhuman(游荡的指针)回复于 2006-03-14 17:15:16 得分 0
我试了2楼兄弟的方法,不行啊,在第一句加载时就异常了,而且我觉得Win32的API并不是面向对象的,这种方法好像不行吧Top
7 楼visualhuman(游荡的指针)回复于 2006-03-14 17:16:37 得分 0
是不是大家搞错了?我的Win32 API可不是COM组件Top
8 楼20011521()回复于 2006-03-14 18:22:00 得分 0
[DllImport("GT200.dll",CharSet=CharSet.Ansi)]Top
9 楼visualhuman(游荡的指针)回复于 2006-03-14 18:51:11 得分 0
楼上的兄弟好像没明白我的意思,我是要动态加载
我找到一篇文章,但是不知道如何实现
您无法指定希望 DLLImport 在运行时从何处查找文件,但是可以利用一个技巧来达到这一目的。
DllImport 调用 LoadLibrary() 来完成它的工作。如果进程中已经加载了特定的 DLL,那么即使指定的加载路径不同,LoadLibrary() 也会成功。
这意味着如果直接调用 LoadLibrary(),您就可以从任何位置加载 DLL,然后 DllImport LoadLibrary() 将使用该 DLL。
由于这种行为,我们可以提前调用 LoadLibrary(),从而将您的调用指向其他 DLL。如果您在编写库,可以通过调用 GetModuleHandle() 来防止出现这种情况,以确保在首次调用 P/Invoke 之前没有加载该库。Top
10 楼zhzuo(秋枫)回复于 2006-03-14 20:33:25 得分 10
Assembly assm = Assembly.LoadFrom("e:\\WindowsApplication.dll");
Type TypeToLoad= assm.GetType("WindowsApplication.Form1");
object obj;
obj = Activator.CreateInstance(TypeToLoad);
Form formToShow = null;
formToShow = (Form)obj;
formToShow.Show();Top
11 楼shuaizhen(object Net)回复于 2006-03-14 21:37:52 得分 0
UPTop
12 楼langmafeng(乞力马扎罗)回复于 2006-03-14 21:48:12 得分 0
用C++再包一次Top




