2011-10-21 17 views
0

私はC#で多数のテストクラスを持っています(NUnit Test scripts、Monoでコンパイル)。C#クラスファイルのすべての依存関係(クラスファイル)を見つける方法

すべての単体テストを1つの大きなアセンブリにコンパイルするのではなく、個々のクラスファイルを別々のアセンブリにコンパイルしたいと思います。これを行うには、依存分析を行いたいので、別々のアセンブリを自動的に生成することができます。

私は何を探していることは、あなたがモノにNUnitのテストを実行したいと仮定すると、Java

+1

例を挙げて質問を明確にしてください。現在、WindowsでMono Unit Testsをコンパイルするかどうかは不明です。あなたは 'それぞれの依存関係のDLLを生成する'(?依存関係は通常DLLです)... – sehe

+0

あなたはこのシナリオを理解することが非常に難しいです。私はすでに個々のクラスファイルを作成したいと書いています。つまり、NUnitテストプロジェクト全体に対して1つのDLLを必要としませんが、NUnitテストプロジェクトの各テストクラスファイルに対して1つのDLLが必要です。感謝 –

+0

正直言って、私はそれが文句だけだと思う​​。どちらにせよ、私は自分の答えを投稿しました – sehe

答えて

0

Mono Cecilをご覧ください。

このライブラリには、実際のアセンブリイメージに「反映する」機能があり、解析することができます。これは、Mono.Cecilを使用して依存関係分析を実行するために、「大きな」アセンブリにコンパイルする意思があることを前提としています。

編集実際には、あなたは単にそれの一部を除外しながら、「大きな」アセンブリをコピーするためにセシルを使用する場合があります。そうすれば、別々のアセンブリをコンパイルするのはあまり複雑ではありません。 Cecilの往復(read - > manipulate - > save)アセンブリの例については、CecilRoundtrip sampleを参照してください。

私は以前に(本質的には、静的コールツリーサーチ) '高度な' 検索用モノラルセシルを使用する方法のかなり大規模な例を公開しています

あなたに最も有用な最小絶対最小値は、おそらく次のようになります:

var types = assemblies 
    .SelectMany(assembly => assembly.MainModule.Types.Cast<TypeDefinition>()); 

var dependencies = types.ToDictionary(
    key => key, 
    typedef => new HashSet<string>(typedef.Methods.Cast<MethodDefinition>() 
       .Where(method => null != method.Body) // ignore abstracts and generics 
       .SelectMany(method => method.Body.Instructions.Cast<Instruction>()) 
       .Select(instr => instr.Operand) 
       .OfType<TypeReference>().Distinct() 
      // .Where(type => !type.Namespace.StartsWith("System")) 
       .Select(type => type.Name))); 

foreach (var entry in dependencies) 
{ 
    Console.WriteLine("{0}\t{1}", entry.Key.Name, string.Join(", ", entry.Value.ToArray())); 
} 

コメント行は、必要に応じてフレームワーク(System.StringSystem.Char等)からのものを除外します。

これは、宣言された型ごとに必要な型をリストします。使用されるタイプの一覧を表示するには、単にアセンブリ名への参照上のタグ:

SegmentSoortKenmerk  SegmentSoortKenmerk 
OperatorValue 
Koppelpad  Koppelpad, CodeLeidendVolgend 
RedenWaarschuwing 
RelExceptions 
GecontroleerdDocument GecontroleerdDocument, GecontroleerdDocument[] 
OwiExtraKenmerk OwiExtraKenmerk, Gegeven, BackofficeRelatie 
Entiteit  Entiteit, SleutelSysteemObject[], EniteitType 

同様のクエリをが、アセンブリ名のルックアップを使用して:第一種の

   .Select(type => type.Module.Assembly.Name.Name))); 

サンプル出力(タイプが必要)

SegmentSoortKenmerk  Lspo.Business 
OperatorValue 
Koppelpad  Lspo.Business 
RedenWaarschuwing 
RelExceptions 
GecontroleerdDocument Lspo.Business 
OwiExtraKenmerk Lspo.Business 
Entiteit  Lspo.Business 
+0

[cecil-roundtrip.cs](https://github.com/mono/cecil/tree/master/tools)へのリンクを追加インスピレーションとして追加しました – sehe

0

のために存在するクラスの依存関係アナライザに似ている、それは(私は喜んでNUnitの2.5と2.4を使用しています、うまく動作するはずですモノ2.10.6)。

よくある間違いの1つは、テストを含む.dllファイルのコピーまたは保存のみです。他のプログラムと同様に、テストには依存関係がありますが、少なくともnunit.framework.dllとテストするクラス/アセンブリ(およびその依存関係)は

です。 DLLの参照(それが実行する必要があるもの)を使用すると、非常に簡単にこれを行うことができます与えられた。

using System.Reflection; 

void PrintRefs(string dllfile){ 
    var asm = Assembly.ReflectionOnlyLoad (dllfile); 

    foreach (var aname in asm.GetReferencedAssemblies()){ 
    Console.WriteLine(aname.Name); 
    } 
} 

それが動的にロードする可能性があることを任意の、これが唯一のプログラムやライブラリがコンパイルされたアセンブリの名前を見つけるだろう、ではない注意してくださいランタイム。

関連する問題