title: Find source file of compiled class in c#
body: <p>I'm looking to find the associated source file(s) for specific class(es) in a set of compiled .net assemblies. </p>
  
  <p>e.g.</p>
  
  <pre><code>MyAsm.Namespace.Foo  -&gt; C:\Source\foo.cs
  MyAsm.Namespace.Bar  -&gt; C:\Source\Code\MoreCode\Common.cs
  MyAsm.Namespace2.Bar -&gt; C:\Source\Code\MoreCode\Common.cs
  ...
  </code></pre>
  
  <p>I have the assembly reflection / extracting the Type information I'm interested in working using standard <code>System.Reflection</code> functionality.</p>
  
  <p>I now need to find the originating .cs source file for the class. While I have a brute force solution in place as a workaround, its unacceptably slow. </p>
  
  <p>I would hope to have the entire process complete in ~5 seconds. Currently, the reflection extraction portion takes less than 1 second, the 'file association' takes minutes. I don't think its unreasonable to scan a couple of MB in 4 seconds. </p>
  
  <p>Unfortunately there are a couple of caveats, which prevent shortcuts.</p>
  
  <ul>
  <li><p>I don't know the names of the files, so I need to do a <code>dir / s *.cs</code> every run, to enumerate all the potential source files.</p></li>
  <li><p>The class name won't always match the source file, it can <em>hint</em> at a possible location, but its not guaranteed to work.</p></li>
  <li><p>Multiple classes are defined in the same file in some cases.</p></li>
  <li><p>There are ~20k .cs files / 63MB of source.</p></li>
  <li><p>I need an association between ~10k of the classes / their files.</p></li>
  <li><p>I would prefer not to incrementally build a DB with the file name / classes declared in it, as the file contents will change, and I'll have the trouble of maintaining this DB etc (though I may have to go down this route if everything else fails).</p></li>
  <li><p>The OS's this will run on, wont have windows search/indexing enabled, so no joy there either.</p></li>
  </ul>
  
  <p><strong>What I've tried:</strong></p>
  
  <ul>
  <li><p>Using findstr.exe - much too slow</p></li>
  <li><p>Creating a .net app, load all files into memory. - too slow to find *.cs / load all the 
  files, fast to scan the files once they are in memory.</p></li>
  <li><p>Creating one large source file from all the smaller files, loading it, scanning etc - again, too slow. Takes minutes to build the file, fast once loaded.</p></li>
  <li><p>Reading PDB files - I'm investigating PDB2XML.exe, and while it does output file names, and runs quickly, I cant see how to associate a class, with the file name. </p></li>
  </ul>
  
  <p>So, does anyone have alternate suggestions, magic or some experience with PDB2XML?</p>