2012-04-02 6 views
1

Ich schreibe eine Anwendung, in der Benutzer nach einer DLL suchen muss verwendet werden. Wenn diese DLL dann nicht die erforderliche Methodendefinition enthält, wird eine Fehlermeldung angezeigt. Früher habe ich folgenden Code:Extrahieren von Methodennamen aus einer nicht verwalteten DLL (VB Dll) über C# Code

private void CheckDll() 
    { 
     string dllName; 
     string methodName; 
     bool isMethodFound = false; 
     OpenFileDialog browseFile = new OpenFileDialog(); 
     browseFile.Filter = "DLL : |*.dll;*.DLL |OCX Files| *.ocx|All File|*.*"; 
     try 
     { 
      if (browseFile.ShowDialog() != DialogResult.Cancel) 
      { 
       methodName = CommonMod.GetMethodName(1); 
       dllName = browseFile.FileName; 
       Assembly loadedDll = Assembly.LoadFile(dllName); 
       foreach (Type memberType in loadedDll.GetTypes()) 
       { 
        if (memberType.IsClass) 
        { 
         MethodInfo method = memberType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); 
         if (method != null) 
         { 
          isMethodFound = true; 
         } 

        } 

       } 
       if (!isMethodFound) 
       { 
        MessageBox.Show(methodName + " method not found in DLL.", "Script Generator", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.Message); 
      Debug.Print(e.Message); 

     } 
    } 
} 

}

Dies funktioniert gut mit .net DLLs aber mit VB-DLL es fehlschlägt, ist es eine Möglichkeit, es für vb DLLs zu tun. danke im voraus.

+0

@Ramhound. VB 6.0 ist nicht verwaltet. Bitte aktualisieren Sie Ihr Wissen – Ishan

+0

um verwaltet zu werden, muss es von einer virtuellen Maschine/Laufzeit * interpretiert * werden. .NET-Code läuft in der CLR, die Bytecode "interpretiert" und Maschinencode ausführt. VB6-Anwendungen sind im Wesentlichen COM-Anwendungen. Seit VB5 konnten sie in native ausführbare Dateien kompiliert werden. Mit anderen Worten, VB6 wird nicht verwaltet. – Will

Antwort

0

Sie verwenden Reflektion, die nur auf .NET-DLLs funktioniert. Für normale DLLs denke ich, dass Sie nach den Win32-Aufrufen LoadLibrary und GetProcAddress

1

kommen Com-Komponenten kommt mit Typ-Bibliothek, die wie eine Schnittstelle für diese konkrete Komponente ist.

Sie können TypeLibConverter.ConvertTypeLibToAssembly verwenden, um ein Interop zu erstellen und dann die Reflektion auf normale Weise zu verwenden.

Sehen Sie hier Beispiel auf msdn

Sie müssen prüfen, ob die DLL-COM-Komponente oder .NET-Assembly jedoch ist. Ein Beispiel ist in dem folgenden Link

How to determine whether a DLL is a managed assembly or native (prevent loading a native dll)?