개발관련/C#

Dll 리소스 포함해서 exe 배포

Diademata 2017. 11. 10. 15:46
반응형

참조에서는 디렉토리 복사 false



리소스에 DLL을 포함 시키던가


아니면 밑의 사진처럼 폴더 만들고 기존파일 추가로 프로젝트에 추가한 후 이벤트로 로딩하면 된다.



   [STAThread]

        static void Main()

        {

            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);

            ApplicationStart();

        }


        private static void ApplicationStart()

        {

            try

            {

               Application.EnableVisualStyles();

               Application.SetCompatibleTextRenderingDefault(false);

 var frmMain = new FrmMain();

               Application.Run(frmMain);


            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message);

            }

        }


        private static Assembly ResolveAssembly(object sender, ResolveEventArgs args)

        {


            //Assembly thisAssembly = Assembly.GetExecutingAssembly();

            //var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

            //foreach (var r in thisAssembly.GetManifestResourceNames())

            //{

            //    if (r.EndsWith(name))

            //    {

            //        using (Stream stream = thisAssembly.GetManifestResourceStream(r))

            //        {

            //            if (stream != null)

            //            {

            //                byte[] assembly = new byte[stream.Length];

            //                stream.Read(assembly, 0, assembly.Length);

            //                Console.WriteLine("Dll file load : " + r);

            //                return Assembly.Load(assembly);

            //            }

            //        }

            //    }

            //}

            //return null;


            //Lamda

            Assembly thisAssembly = Assembly.GetExecutingAssembly();

            var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";

            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));

            if (resources.Count() > 0)

            {

                string resourceName = resources.First();

                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))

                {

                    if (stream != null)

                    {

                        byte[] assembly = new byte[stream.Length];

                        stream.Read(assembly, 0, assembly.Length);

                        Console.WriteLine("Dll file load : " + resourceName);

                        return Assembly.Load(assembly);

                    }

                }

            }

            return null;

        }

반응형