レガシ コードを使用していて、たまたま Microsoft Moles を使用することに追い込まれた場合に備えて、私はこのトピックについて徹底的に掘り下げました。
Moles ディレクトリ (C:\Program Files.. 内) に移動し、コマンド ライン ユーティリティ (moles.exe) を管理者として実行することを意味する、受け入れられた回答の提案を使用してみました。多くのオプションがあり、そのうちの 1 つを使用すると、参照されたアセンブリを含めることができます (上記で提案したように)。
ただし、アセンブリを参照せずにユーティリティを実行しようとしても、ユーティリティは最終的に、定義済みの参照アセンブリ パスを使用して C# コンパイラ (csc.exe) を呼び出します。ここで、.NET Framework のバージョン間の混乱が発生すると結論付けています。これらのアセンブリ パスを含めないようにすることはできませんでした。
私の具体的なシナリオは、カスタム アセンブリをほくろしようとしていたというものでしたが、明らかに、このマシンに .NET 4.5 がインストールされていたため、コンパイル時に System.Collections.Generics IReadOnlyCollection、IReadOnlyDictionary について不平を言っていました。
解決策: 私が解決した唯一の解決策は、Mole フィルターを使用することでした。これについては、他の投稿や Microsoft Moles Web サイト (メイン ページに .NET 4.5 トラブルシューティングへの特別なリンクがあります) を参照してください。Visual Studio では、ソリューション エクスプローラーで右クリックして、参照するカスタム アセンブリの単体テスト プロジェクトに Moles アセンブリを追加するだけです。次にビルドしてみました。受け取ったエラーごとに、問題のあるクラスを記録し、moles ファイルに以下を追加して、それらをシムまたはスタブから除外しました。
<Moles xmlns="http://schemas.microsoft.com/moles/2010/">
<Assembly Name = "MyCustomAssembly" />
<StubGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</StubGeneration>
<MoleGeneration>
<Types>
<Remove TypeName="ClassThatUsesIReadOnlyCollectionEtc" />
</Types>
</MoleGeneration>
</Moles>
モル/スタブ生成から除外しているクラスが必要な場合は明らかにうまくいきませんが、問題のあるクラスは重要ではなく、スタブやシムを行う必要がないため、私の場合はうまくいきました。それらのクラス。