2

コンソールアプリで参照されているアセンブリを反復処理しようとしています。他のプロジェクトでBuildManager.GetReferencedAssembliesを使用してこれを行っていますが、コンソールアプリケーションで、InvalidOperationExceptionが発生します。このメソッドは、アプリケーションの開始前の初期化段階では呼び出すことができません。

私の知る限り、コンソールアプリでの実行を遅らせる方法はありません。あなたは静的なvoidMainでそれをします、あるいはあなたはそれを全くしません...誰かがこれを回避する方法について何か提案がありますか?

4

2 に答える 2

6

System.Web.Compilation名前空間からのBuildManager.GetReferencedAssemblies()?

私の知る限り、これはASP.NET固有であるため、コンソールアプリでは機能しません。(または、Windowsアプリの場合も同様です。)

したがって、最初のサブ質問は、BuildManager.GetReferencedAssembliesの特別な機能が必要かどうか、つまり、ASP.NET固有のアセンブリ参照方法に加えて、アプリケーションが使用するすべてのアセンブリだけでなく、それを調べて見つけることです。参照しますが、それらが参照するすべてのアセンブリなど。

AppDomain.GetAssembliesとBuildManager.GetReferencedAssembliesの違いを参照してください)

実行しようとしていることが、.exeが直接参照するアセンブリのリストだけで正常に機能する場合(さらに、コードによって明示的に、またはそれ自体が参照する参照アセンブリを呼び出すことによって暗黙的にロードされたアセンブリのリスト)それら)、最も簡単な方法はこれだけです:

// Get all currently loaded assemblies.
var assemblies = AppDomain.CurrentDomain.GetAssemblies();

そうでない場合は、アプリが間接的に参照するすべてのアセンブリのリストを取得する簡単な方法が.NETにないため、複雑になります。理論的には、Assembly.GetEntryAssembly()でAssembly.GetReferencedAssemblies()を再帰的に呼び出すコードを記述し、そこから取得するすべての結果で、次にそれらから取得するすべての結果で、重複を破棄して、無限ループに陥ることはありません。最終的には、アプリによって直接または間接的に静的に参照されるすべてのアセンブリになります。

(たとえば、AppDomain.Load()などによってアセンブリを動的に参照する場合、それらはリストされません。しかし、BuildManager.GetReferencedAssemblies()もリストされないと思います。)

于 2010-08-05T22:50:28.073 に答える
1

AppDomain.CurrentDomain.GetAssemblies()はうまくいきませんでした。参照されていたものの、含まれていないアセンブリがいくつかありました。私がしたことはこれでした:

allAssemblies = (from name in Assembly.GetEntryAssembly().GetReferencedAssemblies()
        select Assembly.Load(name)).ToList();

これは、AppDomain.CurrentDomain.GetAssemblies()ほど多くのアセンブリを返しませんでしたが、必要なアセンブリを返しました。不一致があった理由がわかりません。お祝いしますが、返信ありがとうございます。あなたは私を必要な軌道に乗せてくれました、そして私はあなたの返事に賛成しました。

于 2010-08-12T16:05:04.367 に答える