Assembly 작업

12284 단어 assembly
다음은 실행 폴더에서 DLL을 검색하고 Assembly 클래스를 통해 로드하는 방법을 보여주는 로드 모듈 DLL 및 프로젝트의 클래스입니다.
using Core.Dependency;

using Core.Logging;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using System.Reflection;

using System.Text;

using System.Web;

using System.Web.Compilation;

using System.Web.Hosting;



[assembly: PreApplicationStartMethod(typeof(Core.Modules.ModuleManager), "Initialize")]

namespace Core.Modules

{

    public class ModuleManager

    {

        static ModuleManager()

        {

            string moduleStartPath = HostingEnvironment.MapPath("~/Modules");

            if (moduleStartPath == null)

                throw new DirectoryNotFoundException("Modules");

            ModuleStartFolder = new DirectoryInfo(moduleStartPath);



            string webBinPath = HostingEnvironment.MapPath("~/bin");

            if (string.IsNullOrEmpty(webBinPath))

                throw new DirectoryNotFoundException("bin");

            WebBinPath = webBinPath;

        }



        /// <summary>

        /// The Module Definition Start folder

        /// </summary>

        private static readonly DirectoryInfo ModuleStartFolder;

        private static readonly string WebBinPath;



        public static readonly Dictionary<string, IModuleDefinition> ModuleDefinitions = new Dictionary<string,IModuleDefinition>();





        /// <summary>

        /// Initialize method that registers all plugins

        /// </summary>

        public static void Initialize()

        {

            Array.ForEach(ModuleStartFolder.GetDirectories(), n => 

            {

                CopyAssembly(n);

            });

            InitializeModule(new DirectoryInfo(WebBinPath)); 

        }



        private static void CopyAssembly(DirectoryInfo directory)

        {

            var dirs = directory.GetDirectories("bin", SearchOption.TopDirectoryOnly);

            if (dirs == null || dirs.Length == 0)

                return;

            var binFolder = dirs.FirstOrDefault();



            try

            {

                var assemblies = binFolder.GetFiles("*.dll", SearchOption.AllDirectories);

                Array.ForEach(assemblies, n => {

                        n.CopyTo(WebBinPath + "\\" + n.Name, true);

                });

            }

            catch (Exception ex)

            {

                var logger = new Logger();

                logger.LogError(ex.Message, ex);

            }

        }



        private static void InitializeModule(DirectoryInfo directory)

        {



            try

            {

                //AppDomain.CurrentDomain.AppendPrivatePath(directory.FullName);

                var assemblies = directory.GetFiles("*.dll", SearchOption.AllDirectories)

                        .Select(x => AssemblyName.GetAssemblyName(x.FullName))

                        .Select(x => Assembly.Load(x.FullName));

                //var assemblies = binFolder.GetFiles(string.Format("{0}.dll", directory.Name), SearchOption.TopDirectoryOnly)

                //        .Select(x => AssemblyName.GetAssemblyName(x.FullName))

                //        .Select(x => Assembly.Load(x.FullName));

                foreach (var assembly in assemblies)

                {

                    //Add the plugin as a reference to the application

                    BuildManager.AddReferencedAssembly(assembly);



                    Type type = assembly.GetTypes().Where(t => t.GetInterface(typeof(IModuleDefinition).Name) != null).FirstOrDefault();

                    if (type != null && !type.IsAbstract && !type.IsInterface)

                    {

                        var module = (IModuleDefinition)Activator.CreateInstance(type);

                        if (!ModuleDefinitions.ContainsKey(module.ModuleFolder))

                        {

                            ModuleDefinitions.Add(module.ModuleFolder, module);

                        }

                    }

                }

            }

            catch (Exception ex)

            {

                var logger = new Logger();

                logger.LogError(ex.Message,ex);

            }

        }



    }

}

관심사:
1. 다음 특성은 APP가 어떤 방법을 실행하기 전에 Module Manager에서 실행하는 방법인itialize를 나타냅니다.
[assembly: PreApplicationStartMethod(typeof(Core.Modules.ModuleManager), "Initialize")]

2. 웹 사이트 디렉터리를 찾습니다.관건은 클래스 Hosting Environment에 운영 환경에 대한 처리 방법이 있다는 것이다.상세 참조:http://msdn.microsoft.com/zh-cn/library/1677yx1a%28VS.80%29.aspx
string moduleStartPath = HostingEnvironment.MapPath("~/Modules");

3. AppDomain 클래스의 응용, 참조:http://www.cnblogs.com/foman/archive/2009/10/18/1585655.html
AppDomain.CurrentDomain.AppendPrivatePath(directory.FullName);

4. DirectoryInfo, FileInfo, File 클래스의 응용 프로그램으로 주로 파일, Copy 파일을 찾는 데 사용됩니다.
5. AssemblyName, Assembly DLL 로드
6. BuildManager 클래스는 주로 Asp. 관리에 사용됩니다.net의 컴파일
7. Activator 클래스는 객체를 작성하는 데 사용됩니다.

좋은 웹페이지 즐겨찾기