C#将Dll嵌入到EXE

感谢博主的方法:

https://blog.csdn.net/lin381825673/article/details/39122257

我之前也看了网上的其他的方法试了都不行

第一种方法就是说用ILMerge打包,执行命令后直接失败。

还有就是将引用的Dll属性改为嵌入式Dll.显示无法嵌入互操作类型,请改用适用的接口。

之后尝试博主的办法:

==================================================================================

在我创建完命令行程序时我居然找不到Resources.resx这个文件,后来浏览工程属性时发现有资源这个选项,

需要手动添加才会有这个文件。

接着选择所需要的dll添加至资源文件,写监听程序

        public Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            string dllName = args.Name.Contains(",") ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll", "");
            dllName = dllName.Replace(".", "_");
            if (dllName.EndsWith("_resources")) return null;
            ResourceManager rm = new ResourceManager(GetType().Namespace + ".Properties.Resources",Assembly.GetExecutingAssembly());
            byte[] bytes = (byte[])rm.GetObject(dllName);
            return System.Reflection.Assembly.Load(bytes);
        }

主程序

        public void Mainmethed()
        {
            
            TestClass cc = new TestClass();
            ReturnClass bb = new ReturnClass();
            ReturnClass resul = cc.TestFunction(bb);
            Console.WriteLine(resul.ReturnBool);
            Console.WriteLine(resul.ReturnInt);
            Console.WriteLine(resul.ReturnString);
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(p.CurrentDomain_AssemblyResolve);
            p.Mainmethed();
            Thread.Sleep(100000);
        }
CurrentDomain_AssemblyResolve不可以设置为static类型,否则里面的GetType()就不可以执行。
Main函数不可以去掉Static,不然找不到程序执行入口。

这个问题居然让我纠结半天。。。最后原来只需要在注册监听事件的时候用p.CurrentDomain_AssemblyResolve作为参数就可以了。
====================================================================================================================================================

猜你喜欢

转载自www.cnblogs.com/cteng-common/p/1324_teng.html
今日推荐