winform 资源文件和dll文件的问题

时间:2022-07-08 00:59:56
   我想单独运行winform的exe文件,但是里面引用了其他的dll文件,想在能把dll文件放到资源文件里面去引用吗? 还是说有其他办法让我既引用dll又能让exe文件单独运行的

6 个解决方案

#1


既然 exe 的运行需要某个 dll,那么这个 dll 就是不可缺少的
只要 exe 能找到这个 dll,那么 dll 放在哪里都无所谓,关键是:找得到
你可以和 exe 放在一起,也可以放到操作系统搜索路径(由环境变量 PATH 指示)中,也可以你自己指定一个目录、也可以包含在 exe 文件中....

#2


引用 1 楼 xuzuning 的回复:
既然 exe 的运行需要某个 dll,那么这个 dll 就是不可缺少的
只要 exe 能找到这个 dll,那么 dll 放在哪里都无所谓,关键是:找得到
你可以和 exe 放在一起,也可以放到操作系统搜索路径(由环境变量 PATH 指示)中,也可以你自己指定一个目录、也可以包含在 exe 文件中....
怎么让他包含在exe之中

#3


资源里面可以放文件啊,运行时写入到磁盘即可。但是你要解决先有鸡还是先有蛋的问题,因为没有dll你的程序运行不了。除非你的主程序也是释放出来的,要么所有dll都是动态加载的。

#4


引用 3 楼 u012315837 的回复:
资源里面可以放文件啊,运行时写入到磁盘即可。但是你要解决先有鸡还是先有蛋的问题,因为没有dll你的程序运行不了。除非你的主程序也是释放出来的,要么所有dll都是动态加载的。
。额怎么写入磁盘。。我这边应该是先有鸡吧,我是点击一个按钮的时候才会运行那个dll里面的方法,不点击可以正常运行

#5


解决了  解决方法:在program.cs里面的的头部加入代码 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
然后在写一个方法    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string resourceName = "WindowsFormsApp2." + new AssemblyName(args.Name).Name + ".dll";
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
WindowsFormsApp2是程序名字  这样就解决了

#6


引用 5 楼 weixin_40068689 的回复:
解决了  解决方法:在program.cs里面的的头部加入代码 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
然后在写一个方法    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string resourceName = "WindowsFormsApp2." + new AssemblyName(args.Name).Name + ".dll";
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
WindowsFormsApp2是程序名字  这样就解决了

哦 对了,还需要把引用的dll文件添加到根目录里面并且将属性里面设置为嵌入文件

#1


既然 exe 的运行需要某个 dll,那么这个 dll 就是不可缺少的
只要 exe 能找到这个 dll,那么 dll 放在哪里都无所谓,关键是:找得到
你可以和 exe 放在一起,也可以放到操作系统搜索路径(由环境变量 PATH 指示)中,也可以你自己指定一个目录、也可以包含在 exe 文件中....

#2


引用 1 楼 xuzuning 的回复:
既然 exe 的运行需要某个 dll,那么这个 dll 就是不可缺少的
只要 exe 能找到这个 dll,那么 dll 放在哪里都无所谓,关键是:找得到
你可以和 exe 放在一起,也可以放到操作系统搜索路径(由环境变量 PATH 指示)中,也可以你自己指定一个目录、也可以包含在 exe 文件中....
怎么让他包含在exe之中

#3


资源里面可以放文件啊,运行时写入到磁盘即可。但是你要解决先有鸡还是先有蛋的问题,因为没有dll你的程序运行不了。除非你的主程序也是释放出来的,要么所有dll都是动态加载的。

#4


引用 3 楼 u012315837 的回复:
资源里面可以放文件啊,运行时写入到磁盘即可。但是你要解决先有鸡还是先有蛋的问题,因为没有dll你的程序运行不了。除非你的主程序也是释放出来的,要么所有dll都是动态加载的。
。额怎么写入磁盘。。我这边应该是先有鸡吧,我是点击一个按钮的时候才会运行那个dll里面的方法,不点击可以正常运行

#5


解决了  解决方法:在program.cs里面的的头部加入代码 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
然后在写一个方法    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string resourceName = "WindowsFormsApp2." + new AssemblyName(args.Name).Name + ".dll";
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
WindowsFormsApp2是程序名字  这样就解决了

#6


引用 5 楼 weixin_40068689 的回复:
解决了  解决方法:在program.cs里面的的头部加入代码 AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
然后在写一个方法    private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string resourceName = "WindowsFormsApp2." + new AssemblyName(args.Name).Name + ".dll";
            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
            {
                byte[] assemblyData = new byte[stream.Length];
                stream.Read(assemblyData, 0, assemblyData.Length);
                return Assembly.Load(assemblyData);
            }
        }
WindowsFormsApp2是程序名字  这样就解决了

哦 对了,还需要把引用的dll文件添加到根目录里面并且将属性里面设置为嵌入文件