Assembly 작업
12284 단어 assembly
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 클래스는 객체를 작성하는 데 사용됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Make 및 MakeFiles. 저게 뭐야?많은 사람들이 인기 있는 저장소에서 이 파일을 보았지만 기억하지 못할 수도 있습니다. 예를 들어 C 프로그램은 개체 파일(.o 확장자)이라는 중간 파일로 컴파일할 수 있으며, 그런 다음 이를 결합하여 실행 파일을 생...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.