我在这篇文 cad.net dll动态加载 上面提及了一个事情,在vs调试cad的时候如果这个时候使用 Assembly.Load(byte) 那么会出现objDebug占用而不是binDebug占用,这是为什么呢?
查阅了下面的类似的问题,发现都不太对的样子.....
https://blog.csdn.net/guangod/article/details/88799393
https://bbs.csdn.net/topics/390744522?utm_medium=distribute.pc_relevant_t0.none-task-discussion_topic-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-discussion_topic-BlogCommendFromBaidu-1.control
https://www.cnblogs.com/ifendou/p/9088265.html
然后我新建了一个net framework控制台工程: [受加载]

namespace ConsoleApp1 { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("输入路径:--------------------------------------------------"); var path = Console.ReadLine(); if (path != null) { var ad = new AssemblyDependent(path); var msg = ad.Load(); Console.WriteLine("反馈:--------------------------------------------------"); bool allyes = true; foreach (var item in msg) { if (!item.LoadYes) { Console.WriteLine(Environment.NewLine + "**" + item.Path + Environment.NewLine + "**此文件已加载过,重复名称,重复版本号,本次不加载!" + Environment.NewLine); allyes = false; } } if (allyes) { Console.WriteLine(Environment.NewLine + "**链式加载成功!" + Environment.NewLine); } } } } } }
然后加载了一个小型的dll工程:[被加载]
代码没有什么意义...只是为了生成一个dll

using System; namespace ClassLibrary1 { public class Class1 { public void Princ() { Console.WriteLine(Environment.NewLine + "a a a a a a a a a a a a a a " + Environment.NewLine); } } }
然后拖拉dll到控制台:
出现了 objDebug占用!!
我们这下知道了几个信息:
- 问题与cad无关.
- 问题与winform和wpf无关.
- 问题net standard和net frameworl无关
- [链式加载]的
Assembly.ReflectionOnlyLoad(File.ReadAllBytes(dll)); 映射区加载并不导致问题;
Assembly.Load(File.ReadAllBytes(dll)); 导致问题的只有内存区加载; - 占用objDebug而不是binDebug...
- 重复编译四次[被加载]会通过编译..(说明了vs内部有机制释放
- 如果写了一个编译后事件,将binDebug的dll复制到H盘目录下:
copy $(TargetPath) "H:"
然后拖拉H盘下的这个dll,再去编译一次.你会惊讶地发现:
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 CS2012 无法打开“D:桌面被加载ClassLibrary1objDebugClassLibrary1.pdb”进行写入 --“文件“D:桌面被加载ClassLibrary1objDebugClassLibrary1.pdb”正由另一进程使用,因此该进程无法访问此文件。”
ClassLibrary1 D:桌面被加载ClassLibrary1CSC 1 活动
怎么也占用了呢?明明加载的都跨盘了......而且这个时候只需要再编译一次,就能通过...刚刚是四次....
说明vs会检索现有所有打开的vs程序下的工程??
如之前的文章所知:我们最后的解决方法是非vs调试打开软件,感觉或许可以通过设置vs来中断它原本的占用..