动态加载C#程序

于忠达 发布于 04/03 12:32
阅读 93
收藏 0

MySQL连接为什么挂死了?别踩坑!>>>

我在用C#开发一个WinForm应用程序,其中有一个插件系统,是通过网络载入动态链接库的形式运行的。为了代码安全起见,网络上的DLL文件并非下载到本地存盘,然后加载;而是直接以流的形式下载到内存,然后用Assembly.Load载入,以反射的方式调用指定的框架方法。这个对于单一DLL文件的插件没有问题,对于有依赖于另外的DLL的插件,则总是出现“FileNotFoundException: 未能加载文件或程序集xxxx”的异常。这种问题如何解决?

示例代码:

//AppDomain.CurrentDomain.Load(File.ReadAllBytes("bin/plugin1-0.dll"));
            AppDomain.CurrentDomain.Load(File.ReadAllBytes("plugin1.bin"));

            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

            string className = "PlugIn.AppStarter";
            Type type = null;
            for (int i = 0; i < assemblies.Length; i++)
            {
                Assembly ass = assemblies[i];
                type = ass.GetType(className, false, false);
                if (type != null)
                {
                    break;
                }
            }
            if (type != null)
            {
                ConstructorInfo ci = type.GetConstructor(new Type[] { });
                if (ci != null)
                {
                    Object obj = ci.Invoke(null);
                    MethodInfo mi = type.GetMethod("Start");
                    mi.Invoke(obj, null);
                }
            }

代码调试阶段,从网络下载插件暂时以磁盘上的文件来模拟。对于单个DLL的插件,这种工作方式没有问题。但对于插件DLL有自己的DLL依赖时,这种动态加载的方式就不起作用了(上文代码中第一行被注释掉的那个)。实验证实如果在插件的Invoke之前把所依赖的DLL下载下来放在我的应用程序的本地是可以继续进行下去的,但必须保证所依赖的DLL文件名必须和插件开发时所用的保持不变,即原先的A.DLL不可以重命名成为B.DLL;但插件主DLL文件是可以任意命名的。

现在要做的是,不想把插件所依赖的动态链接库保存为本地文件(既有代码安全问题,也大概率会重名),敢问大牛这种情况应该如何解决?

加载中
0
OSC_小韭菜
OSC_小韭菜

Load、LoadFile、LoadFrom这三个方式里有一个是可以做到的,具体的我忘了,你可以百度一下这三个的区别

返回顶部
顶部