如题,就像在VC中LoadLibrary方法一样,C#应该如果做?
我要将一个DLL在内存中加载多次,以满足多线程的要求

解决方案 »

  1.   

    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();
    }
    }
    }
      

  2.   

    我的DLL是Win32的API,以前是用DllImport加载的,但好像是隐式加载,都加载到了一块内存中,由于DLL涉及TCP/IP的同步通信,多线程调用事会有问题
      

  3.   

    ,学习,我也只知道用DllImport
      

  4.   

    突然想到二楼的方法行啊。
    首先自己封装WinAPI,然后再使用二楼提供的办法动态装载自己封装的DLL
    不知道行不,哈哈
      

  5.   

    可以,但是要先用C#封装一层(添加引用时IED会自动完成类型导入)再使用动态加载
      

  6.   

    我试了2楼兄弟的方法,不行啊,在第一句加载时就异常了,而且我觉得Win32的API并不是面向对象的,这种方法好像不行吧
      

  7.   

    是不是大家搞错了?我的Win32 API可不是COM组件
      

  8.   

    [DllImport("GT200.dll",CharSet=CharSet.Ansi)]
      

  9.   

    楼上的兄弟好像没明白我的意思,我是要动态加载
    我找到一篇文章,但是不知道如何实现    您无法指定希望 DLLImport 在运行时从何处查找文件,但是可以利用一个技巧来达到这一目的。   DllImport 调用 LoadLibrary() 来完成它的工作。如果进程中已经加载了特定的 DLL,那么即使指定的加载路径不同,LoadLibrary() 也会成功。   这意味着如果直接调用 LoadLibrary(),您就可以从任何位置加载 DLL,然后 DllImport LoadLibrary() 将使用该 DLL。   由于这种行为,我们可以提前调用 LoadLibrary(),从而将您的调用指向其他 DLL。如果您在编写库,可以通过调用 GetModuleHandle() 来防止出现这种情况,以确保在首次调用 P/Invoke 之前没有加载该库。
      

  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();