Frage

Ich bin versucht, eine DLL-2.0 mit dem C # .NET Framework zu schreiben. Alles kompiliert in Ordnung, aber wenn ich versuche, die DLL aus meiner Anwendung zugreifen zu können, scheitert es, wenn versucht wird, die Prozedur-Adresse zu erhalten. So wickelte ich die DLL in Dependency Walker, und all meinen öffentlichen Funktionen fehlen!

Meine DLL, so weit, ist recht einfach:

namespace MyDll_Namespace
{
    public class MyDllClass
    {
        public static int Func1( /* params */ ) { /* ... */ }

        public static int Func2( /* params */ ) { /* ... */ }

        public static int Func3( /* params */ ) { /* ... */ }

        public static int Func4( /* params */ ) { /* ... */ }
    }
}

Es gibt nicht viel anders, nur wenige Konstanten und Delegierten innerhalb der Klasse definiert ist, sowie außerhalb der Klasse im Namespace. Irgendwelche Gedanken oder Vorschläge würden sehr geschätzt. Danke.

Andere Tipps

Dependency Walker ist für Win32-DLLs (die nativen Code ), nicht .NET-Assemblies (die verwaltetem Code ). Es wird diese Methoden nicht in einer beliebigen Klasse finden (auch wenn sie statisch sind). Wenn Sie von nativen Code verwalteten Code aufrufen müssen, gibt es Möglichkeiten, das zu tun, aber es ist nicht ziemlich .

Wenn Sie Ihre DLL über verwalteten Code verwenden möchten, ist es viel einfacher. Schauen Sie sich System.Assembly und Activator .

Ein Beispiel hierfür:

var assembly = Assembly.LoadFile(@"\path\to\your.dll");
var mydllclass_type = assembly.GetType("MyDllClass");
var instance = Activator.CreateInstance(mydllclass_type);

Die Instanz wird ein Objekt sein. Um die Methoden aufrufen, müssen Sie Reflektion verwenden, da die Schnittstelle nicht zur Compile-Zeit bekannt ist.

Wenn Sie ein Plugin-System erstellen, ist der beste Weg, um eine gemeinsame Schnittstelle oder abstrakte Basis für alle Plugins zu haben, und hat die von Ihrem Programm verwies. Diese Dritten, die ein Plugin zu implementieren, wird auch diesen Vertrag verweisen. In diesem Fall ändert sich die letzte Zeile ein Bit:

var instance = (IMyDllClass)Activator.CreateInstance(mydllclass_type);

Nun können Sie die Methoden, wie in einem regelmäßig konstruiertes Objekt verwenden.

Ein Teil des Problems ist hier, dass Dependency Walker ein Werkzeug für native Anwendungen ist. Es versteht nicht verwalteten Code und wird daher keine der verwalteten Typen + Methoden zeigen, dass Sie definiert haben.

Ich bin von dieser Linie in Frage verwirrt

  

, wenn ich versuche, die DLL aus meiner Anwendung zugreifen zu können, scheitert es, wenn versucht wird, die Prozedur-Adresse zu erhalten

Das klingt ein bisschen wie ein Fehler, den ich in einer nativen Anwendung sehen würde, nicht ein verwaltetes ein. Sind Sie versuchen, den C # -Code von einer nativen Anwendung zugreifen? Wenn dem so ist dies nur über COM Magie erfolgen und nicht über direkte Berufung. Können Sie genauer erklären, was hier los ist?

Versuchen .net Reflector, genau zu sehen, was in Ihrem eingebauten DLL ist (um sicherzustellen, dass alles zu machen, ist die Möglichkeit, es zu soll). Auch stellen Sie sicher, in Release-Modus befinden, während die DLL Gebäude vor Referenzierung es ... ich weiß nicht, ob es zu ändern nichts los ist, aber es lohnt sich der Versuch =)

Sie müssen einen Verweis auf die DLL hinzuzufügen und die Laufzeit automatisch können Sie Ihre Funktion aufzurufen. Hier ist ein kleines Tutorial auf eine .NET-Klassenbibliothek zu schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top