Laden...

DLL einbinden

Erstellt von Artemis vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.596 Views
A
Artemis Themenstarter:in
24 Beiträge seit 2005
vor 18 Jahren
DLL einbinden

Hi ich hab folgendermaßen die Scintilla-Dll eingebunden:


Assembly Dll = Assembly.LoadFrom("SciLexer.dll")

Jetzt sagt er mir, dass das Format invalid sei!!
Heißt das, dass man nur mit c# geschriebene dlls importieren kann??

Wie kann man denn andere Dlls importieren, hietr die Scintilla-Dll (C++).

thx for answers

jonas

N
4.644 Beiträge seit 2004
vor 18 Jahren

Schau Dir mal das Attribut DllImport an.

1.549 Beiträge seit 2004
vor 18 Jahren

Man kann nicht nur dlls importieren die mit C# geschrieben sind sondern alle die .NET Kompatibel sind was C++ angeht kannst du ja mal die Forensuche nutzen Stichwort
COM "C++" dll da müsstest du fündig werden

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
8.746 Beiträge seit 2005
vor 18 Jahren

Mit Assembly.Load() wird eine .NET-Assembly (!) in die AppDomain geladen. Also KEINE unmanaged DLLs. Das geht nur mit DLLImport.

Die Definition bei DLLImport ist zwar statisch, die DLL wird aber erst bei der ersten Benutzung der DLL geladen.

Richtig übel wird es allerdings, wenn du versuchst unmanaged DLLs dynamisch zu laden. Mit LoadLibrary() kannst du die DLL zwar laden, aber du kannst keine Methode aufrufen, weil du mit dem Funktionspointer nichts anfangen kannst. Da musst du dann auf ganze üble Assembler-Hacks (nicht mehr plattformunabhängig) und Fassaden-.NET-DLLs ausweichen. Leider sehr unflexibel und aufwändig.

Von Plug-Ins-Konzepten mit unmanaged DLLs sollte man daher in .NET die Finger lassen. Hier muss man einen .NET-Wrapper je Plugin schreiben, die mittels DLLImport hart mit der entsprechenden unmanaged DLL verheiraten und dann die .NET-Wrapper als PlugIn laden.

Alternativ kann man COM-Objekte bauen und nutzen. Aber auch die kann man nur statisch nutzen, weil ebenfalls .NET-Wrapper generiert werden müssen.

A
Artemis Themenstarter:in
24 Beiträge seit 2005
vor 18 Jahren

Hmm.

Mein Problem ist, dass ich nicht weiß, was in der DLL drin ist!

Ich hab dieses Beispiel in der Doku gefunden:

[DllImport("KERNEL32.DLL", EntryPoint="MoveFileW",  SetLastError=true,
CharSet=CharSet.Unicode, ExactSpelling=true,
CallingConvention=CallingConvention.StdCall)]
public static extern bool MoveFile(String src, String dst);

Jetzt hab ich die Dll so eingebunden:

[DllImport("SciLexer.dll")]

Mein Problem steht oben!!

Ich hab mal gelesen, dass man dll einbindet, und diese dann eine eigene Klasse generieren, auf die man zugrefien kann!! Oder geht das nur bei .net-dlls???

Hat schon jemand mit Scintilla gearbeitet in c#?

Oder gibt es in C# auch klassen mit einem richtexteditor mit

  • syntaxhighlighting
  • codecompletition
  • einklappen
    usw
    ????
A
Artemis Themenstarter:in
24 Beiträge seit 2005
vor 18 Jahren

weiß es keiner????

1.549 Beiträge seit 2004
vor 18 Jahren

Hier ist ein kleines Einfaches Keyword-Highlighting Einfaches Keyword-Highlighting wenn dir dass nicht reicht schau dir doch mal die Editor Komponente von #Develop an

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
8.746 Beiträge seit 2005
vor 18 Jahren

Original von JonasCleve
Mein Problem ist, dass ich nicht weiß, was in der DLL drin ist!

Das ist tatsächlich ein Problem. Wenn man mit DLLs arbeitet - egal in welcher Sprache - dann braucht man eine genaue Beschreibung aller Funktionen und Parameter. Meist liegt das ist Form von C-Header-Dateien vor (wenn man C kann, dann ist es leicht daraus die .NET-DllImports abzuleiten). Du brauchst in JEDEM Fall eine Doku für die DLL. Wie soll man etwa benutzen von dem man gar nicht weiss ob es existiert und wie es aussieht?

Ich hab mal gelesen, dass man dll einbindet, und diese dann eine eigene Klasse generieren, auf die man zugrefien kann!! Oder geht das nur bei .net-dlls???

Genau dies passiert, wenn man COM-Objekte (liegen auch als DLL vor) einbindet. Diese DLLs gehorchen einem definierten Aufbau, der es ermöglicht, den Inhalt (Interfaces) des COM-Objektes/DLL auszulesen. Die DLL gibt also über sich selbst Auskunft .NET generiert dann automatisch eine .NET-Klasse, die das COM-Objekt kapselt. Bei "normalen" DLLs geht das allerdings nicht.

A
Artemis Themenstarter:in
24 Beiträge seit 2005
vor 18 Jahren

Danke!

EDIT:
Was ist denn die Editor Komponente von #Develop??
Meinst du damit die aus dem source??

1.549 Beiträge seit 2004
vor 18 Jahren

Ja die habe ich gemeint die Bietet doch alles was du oben haben wolltest oder nicht?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld