繁体   English   中英

Visual Studio C#/csc 在构建时多次写入.dll output 文件

[英]Visual Studio C#/csc writes .dll output file more than once when building

我正在制作一个应用程序,每当写入文件时都会重新加载 a.dll。 这样,当我构建时,我会自动加载更改。

我正在像这样使用 FileSystemWatcher(简化):

        const string DllDir = @"C:\blah\bin\Debug\net6.0";
        const string DllFile = "dependency.dll";

        static void Main(string[] args)
        {
            var stopwatch = Stopwatch.StartNew();
            using var watcher = new FileSystemWatcher(DllDir, DllFile);
            watcher.NotifyFilter = NotifyFilters.LastWrite;
            watcher.Changed += (a, b) =>
            {
                stopwatch.Stop();
                Console.WriteLine("Changed " + stopwatch.Elapsed);
                stopwatch.Restart();
            };
            watcher.EnableRaisingEvents = true;
            while (true) ;
        }

但每当我构建dependency.dll项目时,从 IDE 解决方案资源管理器中右键单击或直接调用 csc ( csc /target:library C:\blah\Example.cs /out:C:\blah\bin\Debug.net6.0\dependency.dll ),我从观察程序中得到了这样的 output :

Changed 00:00:14.6056924
Changed 00:00:00.0000761

首先是我启动观察程序后的 14 秒延迟,直到 dll 发生变化,然后 76 微秒后它再次发生变化。 我正在使用 Visual Studio 2022。

我已经搜索过,但仍然完全不知道发生了什么。

谁能向我解释发生了什么事? 是否有命令行参数或一些项目配置来避免这种情况? 我正在尝试尽可能快地构建,所以我想了解执行此操作以禁用它的不必要步骤。 否则我想我可以在构建后步骤中将 dll 复制到另一条路径,但无论如何我都想了解编译器在做什么。

谢谢

显然,这与监视文件而不是构建过程有关。 将副本添加到构建后步骤会在目标路径上显示相同的行为。

NotifyFilters 文档说:

LastWrite:文件或文件夹最后写入任何内容的日期。

但是 OnChanged 文档进一步扩展了这一点:

当对文件或目录的大小、系统属性、上次写入时间、上次访问时间或安全权限进行更改时调用 OnChanged

所以可能对单个构建或副本进行了多项更改。

感谢https://stackoverflow.com/a/60088655/10060021

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM