2017-03-14 68 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. ... 
      } 

    } 

}