1

重複の可能性:
リフレクション (DotNET) を使用してアセンブリ内のすべての名前空間を検索する

10 から 30 の dll のリストを持っていると考えてみましょう。これらの dll によってインポートされたすべての名前空間をリストする必要があります。

リフレクションを使用して次のコードを試しました

string[] fileEntries = Directory.GetFiles(sDir, "*.dll");
                foreach (string fileName in fileEntries)
                {
                    Assembly assembly = Assembly.LoadFrom(fileName);
                    List<string> namespaces = new List<string>();
                    foreach (var type in assembly.GetTypes())
                    {
                        string ns = type.Namespace;
                        if (!namespaces.Contains(ns))
                        {
                            namespaces.Add(ns);
                            Console.WriteLine(ns);
                        }
                    }

                }

ただし、それらのdllの名前空間のみを取得するだけです。

たとえば、プログラムを考えてみましょう

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace sample
{
    public partial class sample : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string pth = filepth("D:/sample1/s.txt");
            createfile(pth);
            Response.Write("File created on path :" + pth);
        }
     }      
}

上記のコードに基づいて、サンプルのみを取得しますが、使用されるすべての名前空間を取得する必要があります

**

using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.IO;

**

それについて私を案内してもらえますか..

貴重なご意見お待ちしております

4

3 に答える 3

2

実行時に名前空間はありません。さらに、提供されたサンプルでは、​​ソースコードのすべての名前空間が使用されているわけではありません(コンテキストメニューから「使用の整理->未使用の使用の削除」を実行します)。

名前空間ではなく、特定のアセンブリの参照アセンブリを検索できます。必要なことを行うには、特定のアセンブリのコード で使用されている(宣言されていないため、簡単に取得できます!)すべての型を知る必要があります。

ILコードを分析せずにそれを行う方法はわかりません。セシルがお役に立てば幸いです...しかし、それは簡単ではなく、熟考のみの作業でもありません

MethodBodyMSDNのクラスの発言からの引用:

モジュール クラスのトークン解決メソッド (ResolveType、ResolveMethod、ResolveType など) を使用して、メソッド本体のトークンを Type オブジェクト、MethodInfo オブジェクト、および FieldInfo オブジェクトに解決し、型、メソッド、メソッド本体で MSIL によってアクセスされるフィールド。メソッド本体を解析するには、メタデータと MSIL 命令形式を完全に理解する必要があります。情報は、共通言語インフラストラクチャ (CLI) のドキュメントに記載されています。

CLI 仕様を自分で学びたいですか?:)

于 2012-08-09T05:38:44.647 に答える
0

あなたが望むことは簡単な仕事ではなく、反省は確かに進むべき道ではありません。主な理由は、使用しているクラスを参照するメソッドのソースにアクセスできないためです。

私が考えることができる唯一の解決策は、dllのすべてのコンポーネントをトラバースする手段を提供するcciとしてのツールです。特に、コードのすべての行から参照されるすべてのタイプ/メソッドにアクセスして、必要なリストを生成できます。

于 2012-08-09T05:38:53.127 に答える
0

使用ブロックを右クリックすると、コンテキストメニューに「使用の整理」が表示されます。この機能には「未使用の使用の削除」という機能があります。

上記のセンテンスはあなたの質問とは無関係ですが、.csファイルの先頭にあるusingブロックでの使用が使用されない場合があるという事実を示しています。Visual Studioのようにコード全体を分析しない限り、名前空間が使用されているかどうかを判断するのは非常に困難です。

また、コードのようにリフレクションを使用すると、アセンブリでは使用されない、アセンブリで定義さassembly.GetTypes()れたタイプが得られます。

于 2012-08-09T05:42:25.267 に答える