在C#里怎么显式的加载DLL? 如题,就像在VC中LoadLibrary方法一样,C#应该如果做?我要将一个DLL在内存中加载多次,以满足多线程的要求 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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(); } } } 我的DLL是Win32的API,以前是用DllImport加载的,但好像是隐式加载,都加载到了一块内存中,由于DLL涉及TCP/IP的同步通信,多线程调用事会有问题 ,学习,我也只知道用DllImport 突然想到二楼的方法行啊。首先自己封装WinAPI,然后再使用二楼提供的办法动态装载自己封装的DLL不知道行不,哈哈 可以,但是要先用C#封装一层(添加引用时IED会自动完成类型导入)再使用动态加载 我试了2楼兄弟的方法,不行啊,在第一句加载时就异常了,而且我觉得Win32的API并不是面向对象的,这种方法好像不行吧 是不是大家搞错了?我的Win32 API可不是COM组件 [DllImport("GT200.dll",CharSet=CharSet.Ansi)] 楼上的兄弟好像没明白我的意思,我是要动态加载我找到一篇文章,但是不知道如何实现 您无法指定希望 DLLImport 在运行时从何处查找文件,但是可以利用一个技巧来达到这一目的。 DllImport 调用 LoadLibrary() 来完成它的工作。如果进程中已经加载了特定的 DLL,那么即使指定的加载路径不同,LoadLibrary() 也会成功。 这意味着如果直接调用 LoadLibrary(),您就可以从任何位置加载 DLL,然后 DllImport LoadLibrary() 将使用该 DLL。 由于这种行为,我们可以提前调用 LoadLibrary(),从而将您的调用指向其他 DLL。如果您在编写库,可以通过调用 GetModuleHandle() 来防止出现这种情况,以确保在首次调用 P/Invoke 之前没有加载该库。 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(); c# socket关于发送连续文件 C/S模式的问题,很急 怎样在ComBox中输入值在 datagridview 中将光标定位到相应的行 CompilerParameters.ReferencedAssemblies无法加入部分程序集引用 MSDN帮助不能用(有图) 如何做局域网内的信息发送与接收?? 菜鸟的C#问题! nokia6600的程序,.net可以开发吗 想问一下暴风影音播放器的面板是怎么做出来的?用c#实现! 水晶报表中、如何加别的控件并在报表中显示 ThreadSharp 请进! 请问这样取CPU编号会不会重复? 0123456789的全排列
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();
}
}
}
首先自己封装WinAPI,然后再使用二楼提供的办法动态装载自己封装的DLL
不知道行不,哈哈
我找到一篇文章,但是不知道如何实现 您无法指定希望 DLLImport 在运行时从何处查找文件,但是可以利用一个技巧来达到这一目的。 DllImport 调用 LoadLibrary() 来完成它的工作。如果进程中已经加载了特定的 DLL,那么即使指定的加载路径不同,LoadLibrary() 也会成功。 这意味着如果直接调用 LoadLibrary(),您就可以从任何位置加载 DLL,然后 DllImport LoadLibrary() 将使用该 DLL。 由于这种行为,我们可以提前调用 LoadLibrary(),从而将您的调用指向其他 DLL。如果您在编写库,可以通过调用 GetModuleHandle() 来防止出现这种情况,以确保在首次调用 P/Invoke 之前没有加载该库。
Type TypeToLoad= assm.GetType("WindowsApplication.Form1");
object obj;
obj = Activator.CreateInstance(TypeToLoad);
Form formToShow = null;
formToShow = (Form)obj;
formToShow.Show();