コンパイルされた.netアセンブリのセットで、特定のクラスに関連付けられたソースファイルを探しています。
例えば
MyAsm.Namespace.Foo -> C:\Source\foo.cs
MyAsm.Namespace.Bar -> C:\Source\Code\MoreCode\Common.cs
MyAsm.Namespace2.Bar -> C:\Source\Code\MoreCode\Common.cs
...
標準System.Reflection
機能を使用して作業したいタイプ情報をアセンブリリフレクション/抽出しています。
ここで、クラスの元の.csソースファイルを見つける必要があります。回避策としてブルートフォースソリューションを用意していますが、許容できないほど遅いです。
プロセス全体が約5秒で完了することを望んでいます。現在、反射抽出部分の所要時間は1秒未満で、「ファイルの関連付け」には数分かかります。4秒で数MBをスキャンするのは無理だとは思いません。
残念ながら、ショートカットを妨げるいくつかの注意事項があります。
ファイルの名前がわからないので、
dir / s *.cs
すべての潜在的なソースファイルを列挙するために、すべての実行を実行する必要があります。クラス名は常にソースファイルと一致するとは限りません。可能な場所を示唆することはできますが、機能することが保証されているわけではありません。
場合によっては、同じファイルに複数のクラスが定義されています。
〜20kの.csファイル/63MBのソースがあります。
〜10kのクラス/それらのファイル間の関連付けが必要です。
ファイルの内容が変更されるため、ファイル名/クラスが宣言されたDBを段階的に構築したくないので、このDBなどを維持するのに問題があります(ただし、すべての場合、このルートをたどる必要があるかもしれません)それ以外の場合は失敗します)。
OSのこれは実行され、Windowsサーチ/インデックス作成が有効になっていないので、そこにも喜びはありません。
私が試したこと:
findstr.exeの使用-遅すぎる
.netアプリを作成し、すべてのファイルをメモリにロードします。-遅すぎて*.csを見つけることができず、すべてのファイルをロードできません。ファイルがメモリに入ったらスキャンするのは高速です。
すべての小さなファイルから1つの大きなソースファイルを作成し、それをロードし、スキャンするなど、やはり遅すぎます。ファイルのビルドには数分かかります。ロードすると高速になります。
PDBファイルの読み取り-PDB2XML.exeを調査しています。ファイル名を出力し、高速に実行されますが、クラスをファイル名に関連付ける方法がわかりません。
それで、誰かが別の提案、魔法、またはPDB2XMLの経験を持っていますか?