none
c#反射加载窗体,如何再加载窗体所需其他dll文件? RRS feed

  • 问题

  • 许久不写代码了,突然需要,写了个winform。

    记得以前有办法加载Assembly之后,通过一个什么方法可以把他相关的也都引入进来的,突然想不起来了。

    我实际的应用就是,写个自动更新程序,启动时候先查一下版本,自动更新,更新后,反射启动主窗体,不过主窗体用了MySql,需要加载MySql.Data.dll,大佬们可否给个Demo或提示下,别说用GAC,这个绿色软件,我没法到客户电脑上去注册,谢谢。

    或是,如果用GAC,怎么代码实现?感谢


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。

    2019年12月3日 7:40

答案

  • er...

    找到了一个解决方法,囧,管用,自问自答了。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace HcsLoader
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                //注册Assembly请求事件
                AppDomain currentDomain = AppDomain.CurrentDomain;
                currentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
    
                Application.Run(new Form1());
            }
    
            private static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                string strFielName = args.Name.Split(',')[0];
                //这个需要自己判断一下,如果是Resource的就返回null,否则报错,如果是自己需要的,就返回地址好了。
                if (strFielName == "MySql.Data")
                {
                    //获取文件路径
                    FileInfo execFile = new FileInfo(Application.ExecutablePath);
                    string filePath = Path.Combine(execFile.DirectoryName, strFielName + ".dll");
                    //加载文件
                    return Assembly.LoadFile(string.Format(filePath, strFielName));
                }
                else
                {
                    return null;
                }
            }
        }
    }
    


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。

    2019年12月3日 7:59