2009-05-16 10 views
2

DLLに存在するすべての関数を列挙できますか?その署名を取得するのはどうですか? C#でこれを行うことはできますか?または、これを行うには低レベルに移動する必要がありますか?それは.NETのDLLならDLL関数を列挙していますか?

よろしくとTKS、 ホセ

+2

はあなたがunmanangedまたは管理対象のDLLについて話しているDLLのエクスポートテーブルを列挙する必要がありますか?実行時または設計時に – VVS

+2

? –

+0

私は実行時にprogrammaticalyしようとしている、彼らはアンマネージドまたは管理することができます – user361526

答えて

3

RedGate's Reflectorは、メソッドの一覧を表示しても、コードを分解したりすることができます。どの開発者のツールボックスにも最適なアイテムです。無料です。

編集:実行時にタイプとメソッドを読み込もうとする場合は、Reflectionを使用します。 AssemblyGetExportedTypesをロードする必要があります。その後、Membersを介してMethodsPropertiesに繰り返します。以下は、MSDNの記事で、MemberInfoの情報を反復する例です。また、ここにMSDN Magazineの記事Extracting Data from .NET Assembliesがあります。

最後に、ロードされたオブジェクトでメソッドを実行するために書いた、ちょっとしたテストメソッドです。この例では

ClassLibrary1のは、クラス1の1つのクラスを持っている:

public class Class1 
{ 
    public bool WasWorkDone { get; set; } 

    public void DoWork() 
    { 
     WasWorkDone = true; 
    } 
} 

そして、ここではテストです:

[TestMethod] 
public void CanExecute_On_LoadedClass1() 
{ 
    // Load Assembly and Types 
    var assm = Assembly.LoadFile(@"C:\Lib\ClassLibrary1.dll"); 
    var types = assm.GetExportedTypes(); 

    // Get object type informaiton 
    var class1 = types.FirstOrDefault(t => t.Name == "Class1"); 
    Assert.IsNotNull(class1); 

    var wasWorkDone = class1.GetProperty("WasWorkDone"); 
    Assert.IsNotNull(wasWorkDone); 

    var doWork = class1.GetMethod("DoWork"); 
    Assert.IsNotNull(doWork); 

    // Create Object 
    var class1Instance = Activator.CreateInstance(class1.UnderlyingSystemType); 

    // Do Work 
    bool wasDoneBeforeInvoking = 
      (bool)wasWorkDone.GetValue(class1Instance, null); 
    doWork.Invoke(class1Instance, null); 
    bool wasDoneAfterInvoking = 
      (bool)wasWorkDone.GetValue(class1Instance, null); 

    // Assert 
    Assert.IsFalse(wasDoneBeforeInvoking); 
    Assert.IsTrue(wasDoneAfterInvoking); 
} 
+1

ありがとう!ネイティブDLL(アンマネージ)でどうすればいいですか? – user361526

1

通常のwin32 DLLについては、the Dumpbin utilityを参照してください。これはVisual C++に含まれています(私が信じる無料の "express"バージョンを含む)。

例:

c:\vc9\bin\dumpbin.exe /exports c:\windows\system32\kernel32.dll 
2

そのマネージDLLの場合:使用反射

場合は、その管理対象外:あなたは

関連する問題