簡體   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