测试篇 关于vs的 objDebug占用 问题研究

我在这篇文 cad.net dll动态加载 上面提及了一个事情,在vs调试cad的时候如果这个时候使用 Assembly.Load(byte) 那么会出现objDebug占用而不是binDebug占用,这是为什么呢?

查阅了下面的类似的问题,发现都不太对的样子.....

测试文件下载

然后我新建了一个net framework控制台工程: [受加载]

AssemblyDependent类在[链式加载]

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);
                    }
                }
            }
        }
    }
}
View Code

然后加载了一个小型的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);
        }
    }
}
View Code

然后拖拉dll到控制台:

  

 

  

出现了 objDebug占用!!

我们这下知道了几个信息:

  1. 问题与cad无关.
  2. 问题与winform和wpf无关.
  3. 问题net standard和net frameworl无关
  4. [链式加载]
    Assembly.ReflectionOnlyLoad(File.ReadAllBytes(dll)); 映射区加载并不导致问题;
    Assembly.Load(File.ReadAllBytes(dll)); 导致问题的只有内存区加载;
  5. 占用objDebug而不是binDebug...
  6. 重复编译四次[被加载]会通过编译..(说明了vs内部有机制释放
  7. 如果写了一个编译后事件,将binDebug的dll复制到H盘目录下:
copy $(TargetPath)  "H:"

然后拖拉H盘下的这个dll,再去编译一次.你会惊讶地发现:

严重性    代码    说明    项目    文件    行    禁止显示状态
错误    CS2012    无法打开“D:桌面被加载ClassLibrary1objDebugClassLibrary1.pdb”进行写入 --“文件“D:桌面被加载ClassLibrary1objDebugClassLibrary1.pdb”正由另一进程使用,因此该进程无法访问此文件。”    
ClassLibrary1 D:桌面被加载ClassLibrary1CSC 1 活动

怎么也占用了呢?明明加载的都跨盘了......而且这个时候只需要再编译一次,就能通过...刚刚是四次....

说明vs会检索现有所有打开的vs程序下的工程??

如之前的文章所知:我们最后的解决方法是非vs调试打开软件,感觉或许可以通过设置vs来中断它原本的占用.. 

原文地址:https://www.cnblogs.com/JJBox/p/14033677.html