0

オフィスで使用している商用ソフトウェアにアドインをロードするツールを開発しています。このソフトウェアのアドインは、ソフトウェアの API のクラスを継承するクラスを含む .NET アセンブリを作成することによって開発できます。

したがって、私のソフトウェアは DLL を調べて、API アドイン クラスから名前で継承するクラスが含まれているかどうかを判断する必要があります。ただし、アプリケーションを API 自体に依存させたくありません。これらのクラスをインスタンス化または実行する必要はなく、API アドイン クラスから継承するクラスの完全な名前を決定するだけです。

次を使用してdllアセンブリをロードできます。

Assembly.LoadFrom(dllFileName)

それでも、ロードされたアセンブリで GetTypes() を呼び出そうとすると。API ファイルが見つからないことを訴える多数の LoaderExceptions を含む ReflectionTypeLoadException が発生します。

私も使用してみReflectionOnlyLoadFrom()ましたが、同じ例外がスローされました。

この情報を取得する他の方法はありますか?ここでもコードを実行する必要はありません。最終的には、API やソフトウェアがまったくインストールされていないコンピューターでツールを動作させたいと考えています。私が知る必要があるのは、完全なクラス名だけです。

4

2 に答える 2

0

これは、フレームワークの Reflection API を使用して行うことはできません。リフレクションでは、アセンブリにアクセスして型のメタデータを読み込む必要があります。あなたができることは、Mono.Cecil (ナゲットで入手可能) のようなものを使用して MSIL を検査することです。アセンブリ内の基本クラスとインターフェイスを持つ型を示すサンプルを次に示します。

using Mono.Cecil;
using Mono.Cecil.Cil;

var assembly = AssemblyDefinition.ReadAssembly("ClassLibrary.dll");
// skip the first type '<Module>' whatever that is.
var types = assembly.MainModule.Types.Skip(1);

foreach (var type in types)
{
    var interfaces = type.Interfaces.Select(i => i.FullName);
    if (interfaces.Any())
    {
         Console.WriteLine("{0} : {1}, {2}", type.FullName, type.BaseType.FullName, string.Join(", ", interfaces));
    }
    else
    {
         Console.WriteLine("{0} : {1}", type.FullName, type.BaseType.FullName);
    }
}

これにより、アセンブリまたはその依存関係が読み込まれることはありません。これは、関心のあるクラスが外部 API クラスから直接継承されていることがわかっている場合に役立ちます。継承に複数のレベルがある場合は、上で示したよりも多くの作業を行う必要があります。

于 2013-04-17T04:29:51.463 に答える
0

を使用することはできませんReflection。依存関係を探すだけの場合は、 を使用してアセンブリObjectExplorer内のクラスを表示し、それらの基本型を確認できます。DLL同じアセンブリに属していない型を探します。

ここで役立つ情報を見つけることができます:
Visual Studio のどのプログラムで、DLL を調べてその API を確認できますか?

于 2013-04-17T04:29:05.287 に答える