2017-03-14 67 views
8

ASP .NET動態生成類&將程序集編譯爲Temporary ASP.NET文件。如何掛鉤ASP .NET編譯過程?

我希望能夠在此過程發生時獲取信息。最終,我想有一個事件將激發源文件的名稱和生成的類名+程序集,以便我可以在原始源文件中的方法和生成的類中的方法之間進行映射。

我會感謝您的幫助。

+0

您可以嘗試以下操作。 (我還沒有測試過)https://msdn.microsoft.com/en-us/library/s10awwz0(v=vs.85).aspx中的'compilers'條目指出它已被棄用,並且「系統的編譯器元素.codeDom部分「是首選。所以你可以嘗試指定。根據https://msdn.microsoft.com/en-us/library/k6bttwes(v=vs.85).aspx#Anchor_2,可以(或可以)使用「Microsoft.CSharp.CSharpCodeProvider」。所以你可以從這個類派生出來,並檢查調用的方法。很可能你需要提供一個自定義的'ICodeGenerator',這可能很麻煩。 – Tamas

+0

你有沒有試過以上? – Tamas

+0

不知道你是否曾經看過asp.net臨時文件夾,那裏有很多,所以你可能會得到太多的信息。 除此之外,Inari的答案聽起來像是一個可能的起點。只要確保你看文件夾AppDomain.CurrentDomain.DynamicDirectory; IncludeSubdirectories設置爲true。爲了確保監控所有的編譯,你需要首先啓動,我建議你使用PreApplicationStartMethodAttribute。 – AardVark71

回答

1

我會推薦使用FileSystemWatcher類爲適當的目錄創建一個觀察器,然後根據它進行處理。

你可以在這裏找到的信息看: https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher(v=vs.110).aspx

從本質上講,觀察者可以讓你獲得事件文件等通過反射在目錄中的改變,其中,那麼你可以使用Assembly類加載和處理有關生成的代碼的信息。我不能說這很容易,但它是非常可行的。你也希望有一個數據庫來跟蹤更改的內容,將源代碼映射到編譯代碼等,以使其更加健壯。

希望這可以指引您朝着正確的方向發展。

1

在闡述建議從@Inari

只要確保你看AppDomain.CurrentDomain.DynamicDirectoryIncludeSubdirectories設置爲true的文件夾。爲了確保你不遲到監視所有的編譯,你需要作爲第一個啓動,所以我建議你使用PreApplicationStartMethodAttribute

這有助於在發生此過程時獲取信息。 如果您還想查找源文件,那取決於您感興趣的內容(只有編譯的程序集?=>反射,也按名稱編譯的剃鬚刀頁面=>)。

[assembly: PreApplicationStartMethod(typeof(Demo.CompilationWatcher), "Initialize")] 
namespace Demo 
{ 
    public static class CompilationWatcher 
    { 
     public static void Initialize() 
      { 
       while (true) 
       { 

        FileSystemWatcher watcher = new FileSystemWatcher(); 
        watcher.Path = AppDomain.CurrentDomain.DynamicDirectory; 
        watcher.IncludeSubdirectories = true; 

        watcher.NotifyFilter = NotifyFilters.Attributes | 
        NotifyFilters.CreationTime | 
        NotifyFilters.DirectoryName | 
        NotifyFilters.FileName | 
        NotifyFilters.LastAccess | 
        NotifyFilters.LastWrite | 
        NotifyFilters.Security | 
        NotifyFilters.Size; 

        watcher.Filter = "*.*"; // consider filtering only *.dll, *.compiled etc 

        watcher.Changed += new FileSystemEventHandler(OnChanged); 
        watcher.Created += new FileSystemEventHandler(OnChanged); 

        watcher.EnableRaisingEvents = true; 
       } 

      } 

      public static void OnChanged(object source, FileSystemEventArgs e) 
      { 
       // your thread-safe logic here to log e.Name, e.FullPath, an d get the source file through reflection/name etc. ... 
      } 

    } 

}