using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.IO;
|
using System.Reflection;
|
using System.Web;
|
|
namespace BatchService.Framework.Utility
|
{
|
/// <summary>
|
/// ³ÌÐò¼¯·´É丨ÖúÀà
|
/// </summary>
|
public static class AssemblyHelper
|
{
|
/// <summary>
|
/// µÃµ½Èë¿Ú³ÌÐò¼¯£¬¼æÈÝWebºÍWinform
|
/// </summary>
|
/// <returns></returns>
|
public static Assembly GetEntryAssembly()
|
{
|
var entryAssembly = Assembly.GetEntryAssembly();
|
if (entryAssembly != null)
|
return entryAssembly;
|
|
if (System.Web.HttpContext.Current == null ||
|
System.Web.HttpContext.Current.ApplicationInstance == null)
|
return Assembly.GetExecutingAssembly();
|
|
var type = System.Web.HttpContext.Current.ApplicationInstance.GetType();
|
while (type != null && type.Namespace == "ASP")
|
{
|
type = type.BaseType;
|
}
|
|
return type == null ? null : type.Assembly;
|
}
|
|
public static string GetPropertyValue<T>(T t, string propertyName)
|
{
|
string ret = "";
|
var types = typeof(T);
|
var memberResult = types.GetProperties().FirstOrDefault(p => p.Name.ToLower() == propertyName.ToLower());
|
var value = memberResult.GetValue(t, null);
|
if (value != null)
|
{
|
ret = value.ToString();
|
}
|
else
|
{
|
ret = "";
|
}
|
return ret;
|
}
|
|
public static IList<Stream> GetResourceStream(Assembly assembly, System.Linq.Expressions.Expression<Func<string, bool>> predicate)
|
{
|
List<Stream> result = new List<Stream>();
|
|
foreach (string resource in assembly.GetManifestResourceNames())
|
{
|
if (predicate.Compile().Invoke(resource))
|
{
|
result.Add(assembly.GetManifestResourceStream(resource));
|
}
|
}
|
|
StreamReader sr = new StreamReader(result[0]);
|
string r = sr.ReadToEnd();
|
result[0].Position = 0;
|
|
return result;
|
}
|
|
/// <summary>
|
/// ɨÃè³ÌÐò¼¯ÕÒµ½¼Ì³ÐÁËij»ùÀàµÄËùÓÐ×ÓÀà
|
/// </summary>
|
/// <param name="inheritType">»ùÀà</param>
|
/// <param name="searchpattern">ÎļþÃû¹ýÂË</param>
|
/// <returns></returns>
|
public static List<Type> FindTypeByInheritType(Type inheritType, string searchpattern = "*.dll")
|
{
|
var result = new List<Type>();
|
Type attr = inheritType;
|
|
string domain = GetBaseDirectory();
|
string[] dllFiles = Directory.GetFiles(domain, searchpattern, SearchOption.TopDirectoryOnly);
|
|
foreach (string dllFileName in dllFiles)
|
{
|
foreach (Type type in Assembly.LoadFrom(dllFileName).GetLoadableTypes())
|
{
|
if (type.BaseType == inheritType)
|
{
|
result.Add(type);
|
}
|
}
|
}
|
|
return result;
|
}
|
|
/// <summary>
|
/// ɨÃè³ÌÐò¼¯ÕÒµ½´øÓÐij¸öAttributeµÄËùÓÐPropertyInfo
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="searchpattern">ÎļþÃû¹ýÂË</param>
|
/// <returns></returns>
|
public static Dictionary<PropertyInfo, T> FindAllPropertyByAttribute<T>(string searchpattern = "*.dll") where T : Attribute
|
{
|
var result = new Dictionary<PropertyInfo, T>();
|
var attr = typeof(T);
|
|
string domain = GetBaseDirectory();
|
string[] dllFiles = Directory.GetFiles(domain, searchpattern, SearchOption.TopDirectoryOnly);
|
|
foreach (string dllFileName in dllFiles)
|
{
|
foreach (Type type in Assembly.LoadFrom(dllFileName).GetLoadableTypes())
|
{
|
foreach (var property in type.GetProperties())
|
{
|
var attrs = property.GetCustomAttributes(attr, true);
|
|
if (attrs.Length == 0)
|
continue;
|
|
result.Add(property, (T)attrs.First());
|
}
|
}
|
}
|
|
|
return result;
|
}
|
|
/// <summary>
|
/// ɨÃè³ÌÐò¼¯ÕÒµ½ÀàÐÍÉÏ´øÓÐij¸öAttributeµÄËùÓÐÀàÐÍ
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="searchpattern">ÎļþÃû¹ýÂË</param>
|
/// <returns></returns>
|
public static Dictionary<string, List<T>> FindAllTypeByAttribute<T>(string searchpattern = "*.dll") where T : Attribute
|
{
|
var result = new Dictionary<string, List<T>>();
|
Type attr = typeof(T);
|
|
string domain = GetBaseDirectory();
|
string[] dllFiles = Directory.GetFiles(domain, searchpattern, SearchOption.TopDirectoryOnly);
|
|
foreach (string dllFileName in dllFiles)
|
{
|
foreach (Type type in Assembly.LoadFrom(dllFileName).GetLoadableTypes())
|
{
|
var typeName = type.AssemblyQualifiedName;
|
|
var attrs = type.GetCustomAttributes(attr, true);
|
if (attrs.Length == 0)
|
continue;
|
|
result.Add(typeName, new List<T>());
|
|
foreach (T a in attrs)
|
result[typeName].Add(a);
|
|
}
|
}
|
|
return result;
|
}
|
|
/// <summary>
|
/// ɨÃè³ÌÐò¼¯ÕÒµ½ÊµÏÖÁËij¸ö½Ó¿ÚµÄµÚÒ»¸öʵÀý
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="searchpattern">ÎļþÃû¹ýÂË</param>
|
/// <returns></returns>
|
public static T FindTypeByInterface<T>(string i_servicename, string searchpattern = "BatchService.Custom*.dll") where T : class
|
{
|
//var interfaceType = typeof(T);
|
string domain = GetBaseDirectory();
|
//domain = Path.Combine(domain, "Plugin");
|
string[] dllFiles = Directory.GetFiles(domain, searchpattern, SearchOption.TopDirectoryOnly);
|
|
foreach (string dllFileName in dllFiles)
|
{
|
foreach (Type type in Assembly.LoadFrom(dllFileName).GetLoadableTypes())
|
{
|
if (i_servicename == type.FullName)
|
{
|
LogHelper.Info("´´½¨ÊµÀý:" + type.FullName);
|
var instance = Activator.CreateInstance(type) as T;
|
return instance;
|
}
|
}
|
}
|
|
return null;
|
}
|
|
public static IEnumerable<Type> GetLoadableTypes(this Assembly assembly)
|
{
|
if (assembly == null) throw new ArgumentNullException("assembly");
|
try
|
{
|
return assembly.GetTypes();
|
}
|
catch (ReflectionTypeLoadException e)
|
{
|
return e.Types.Where(t => t != null);
|
}
|
}
|
|
/// <summary>
|
/// µÃµ½µ±Ç°Ó¦ÓóÌÐòµÄ¸ùĿ¼
|
/// </summary>
|
/// <returns></returns>
|
public static string GetBaseDirectory()
|
{
|
var baseDirectory = AppDomain.CurrentDomain.SetupInformation.PrivateBinPath;
|
|
if (AppDomain.CurrentDomain.SetupInformation.PrivateBinPath == null)
|
baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
|
|
return baseDirectory;
|
}
|
|
public static string GetBaseDirectory_Autoswitch()
|
{
|
var ret = "";
|
DirectoryInfo dirInfo = new DirectoryInfo(GetBaseDirectory());
|
if (IsWebApp())
|
{
|
ret = dirInfo.Parent.FullName;
|
}
|
else
|
{
|
ret = dirInfo.FullName;
|
}
|
return ret;
|
}
|
|
/// <summary>
|
/// ÅжÏÊÇ·ñÊÇweb³ÌÐò
|
/// </summary>
|
/// <returns>true£ºÊÇ£¬false£ºwinform</returns>
|
public static bool IsWebApp()
|
{
|
bool flag = false;
|
if (HttpContext.Current != null)
|
{
|
flag = true;
|
}
|
//·ñÔòÊÇwinform³ÌÐò
|
return flag;
|
}
|
|
}
|
}
|