Files
VisionEdit/ToolLib.VisionJob/VisionToolFactory.cs

149 lines
5.0 KiB
C#
Raw Normal View History

using System;
2021-03-17 16:08:13 +08:00
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using CommonMethods;
using System.IO;
namespace VisionJobFactory
{
public class VisionToolFactory
{
private static Dictionary<ToolType, Type> animalTypeDic = new Dictionary<ToolType, Type>();
public static void InitVisionToolTypeDic()
{
animalTypeDic.Clear();
//读取所有带有VisionToolAttribute的类
var classEnumerator = new ClassEnumerator(typeof(VisionToolAttribute), null, typeof(VisionToolAttribute).Assembly);
var em = classEnumerator.Results.GetEnumerator();
while (em.MoveNext())
{
var classType = em.Current;
var atts = classType.GetCustomAttributes(typeof(VisionToolAttribute), true);
if (atts.Length > 0)
{
var att = atts[0] as VisionToolAttribute;
if (null != att)
{
animalTypeDic.Add(att.ToolType, classType);
}
}
}
}
public static IToolInfo CreateToolVision(ToolType animalType, string toolName)
{
if (animalTypeDic.ContainsKey(animalType))
{
return (IToolInfo)Activator.CreateInstance(animalTypeDic[animalType], new object[] { toolName });
}
return null;
}
public static IToolInfo CreateToolVision(ToolType animalType)
{
if (animalTypeDic.ContainsKey(animalType))
{
return (IToolInfo)Activator.CreateInstance(animalTypeDic[animalType]);
}
return null;
}
}
//根据Attribute提取类
public class ClassEnumerator
{
protected List<Type> results = new List<Type>();
public List<Type> Results
{
get
{
return results;
}
}
private Type AttributeType;
private Type InterfaceType;
public ClassEnumerator(Type InAttributeType, Type InInterfaceType, Assembly InAssembly, bool bIgnoreAbstract = true, bool bInheritAttribute = false, bool bShouldCrossAssembly = true)
{
AttributeType = InAttributeType;
InterfaceType = InInterfaceType;
try
{
if (bShouldCrossAssembly)
{
Assembly[] Assemblys = AppDomain.CurrentDomain.GetAssemblies();
if (Assemblys != null)
2021-03-17 16:08:13 +08:00
{
for (int i = 0, len = Assemblys.Length; i < len; i++)
2021-03-17 16:08:13 +08:00
{
CheckInAssembly(Assemblys[i], bIgnoreAbstract, bInheritAttribute);
2021-03-17 16:08:13 +08:00
}
}
//List<Assembly> allAssemblies = new List<Assembly>();
//string path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
//string[] FILES = Directory.GetFiles(path, "*.dll");
//foreach (string dll in Directory.GetFiles(path, "*.dll"))
// allAssemblies.Add(Assembly.LoadFile(dll));
// 手动寻找该dll若dll名称改变需要重新编译不智能
// Assembly assem = Assembly.LoadFile($"{AppDomain.CurrentDomain.BaseDirectory}ToolLib.VisionToolList.dll");
//if (allAssemblies != null)
//{
// for (int i = 0; i < allAssemblies.Count; i++)
// {
// CheckInAssembly(allAssemblies[i], bIgnoreAbstract, bInheritAttribute);
// }
//}
2021-03-17 16:08:13 +08:00
}
else
{
CheckInAssembly(InAssembly, bIgnoreAbstract, bInheritAttribute);
}
}
catch (Exception e)
{
Debug.WriteLine("Error in enumerate classes: " + e.Message);
}
}
private void CheckInAssembly(Assembly InAssembly, bool bInIgnoreAbstract, bool bInInheritAttribute)
{
Type[] types = InAssembly.GetTypes();
if (null == types)
{
return;
}
for (int i = 0, len = types.Length; i < len; i++)
{
var type = types[i];
if (InterfaceType == null || InterfaceType.IsAssignableFrom(type))
{
if (!bInIgnoreAbstract || (bInIgnoreAbstract && !type.IsAbstract))
{
if (type.GetCustomAttributes(AttributeType, bInInheritAttribute).Length > 0)
{
results.Add(type);
}
}
}
}
}
}
}