问题:编写了一个监控文件夹里dll的程序,当有新dll的时候自动添加里面的类
VS里面调试启动没有任何问题
但是直接运行就会闪退 ????
解决
步骤一:
在Assembly.LoadFile 的时候加入try 捕捉到异常为
Message: System.IO.FileLoadException: 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)
检查了所有程序 没有人占用啊。。。。。。。。 还能删除
步骤二:
想起来 debug和直接运行的最大区别就是 直接运行会快很多。。。。。。
那索性等dll 拷贝完成试试 Thread.Sleep(1000);
private static void LoadDllLoadMenu(string FullPath)
{
try
{
Thread.Sleep(1000);
//动态加载程序集
Assembly assembly = Assembly.LoadFile(FullPath);
if (assembly != null)
{
{
获取程序集中指定的类类型,参数为:命名空间.类型名
//var type = assembly.GetType("ConsoleApp2.Xiaoa");
创建实例,方法一
//var obj = Activator.CreateInstance(type);
创建实例,方法二 ,参数为:命名空间.类型名
var obj = assembly.CreateInstance("DynamicReferenceDLL.MyMath");
获取实例中的方法
//var method = type.GetMethod("e");
调用实例方法
//object result = method.Invoke(obj, new object[] { });
}
{
//Type t = nameSpaceAll.Where(x => x.Name == tableName.ToString()).FirstOrDefault();
// assembly.GetTypes() //获取当前类库下所有类型
//.Where(t => typeof(I_Sl651).IsAssignableFrom(t)) //获取间接或直接继承t的所有类型
//.Where(t => !t.IsAbstract && t.IsClass) //获取非抽象类 排除接口继承
IEnumerable<Type> wormMain = assembly.GetTypes().Where(t => !t.IsAbstract && t.IsClass);
ListAgreementClass.AddRange(wormMain);
// m.GetInterface(typeof(I_Sl651).Name) != null);
//var tmpObj = (SL651Standard)Activator.CreateInstance(wormMain);
//tmpObj.LoadMenu();
}
}
}
catch (Exception ex)
{
Logging.SaveLog(ELogLayer.Transfer, ex.ToString(), ELogType.Error);
}
再次直接运行 没问题了。。。。