Entwickler-Ecke
IO, XML und Registry - ... kann nicht gemarshalt werden?
AeroX - Do 03.04.08 10:32
Titel: ... kann nicht gemarshalt werden?
hallo,
ich habe mal probiert eine DLL einzubinden, aber das geht net (..kann nicht gemarshalt werden)
hier der code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.IO;
namespace UseDLLs { class Program { [DllImport("Search.dll")] public static extern string[] SearchForFile(string _dir, string _file, int _ArrayLength);
static void Main(string[] args) { Console.WriteLine(SearchForFile(Directory.GetCurrentDirectory(), "Search.dll", 1)[0]); } } } |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Christian S. - Do 03.04.08 10:55
Dein Thread-Titel ist ein bisschen sparsam, erweitere ihn bitte um ein paar mehr Informationen. Danke! :-)
Zu Deinem Problem: Wie sieht denn die Signatur der Funktionen in der search.dll aus?
AeroX - Do 03.04.08 11:24
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.IO;
namespace Search { public class Class1 { string[] FileArray; int i;
public string[] SearchForFile(string _dir, string _file, int _ArrayLength) { i = 0; FileArray = new string[_ArrayLength]; OpenDir(_dir, _file); return FileArray; }
private void OpenDir(string _dir, string _file) { try { foreach (string file in Directory.GetFiles(_dir)) { if (file.Equals(_file)) { FileArray[i] = file; i++; } } foreach (string dir2 in Directory.GetDirectories(_dir)) { OpenDir(dir2,_file); } } catch { }
} } } |
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Christian S. - Do 03.04.08 11:37
DLLImport wird nur für DLLs benutzt, die nicht managed sind. In Deinem Fall kannst Du viel einfacher vorgehen:
Füge Deiner Anwendung eine Referenz auf die DLL-Datei hinzu (wie Du es mit den DLLs des Frameworks auch machst) und binde den Namespace "Search" ein. Dann kannst Du den Inhalt der DLL so nutzen, als wäre er in Deiner Anwendung.
Bitte benutze demnächst cs- statt code-Tags. Danke!
//edit: Noch ein paar Anmerkungen zu Deiner Klasse:
1. "Class1" ist kein guter Name für Deine Klasse
2. Benutze für das FileArray eine List<String> anstatt eines Arrays. Dann musst Du auch nicht so gruselige Code-Konstrukte benutzen, um abzufangen, wenn Du über Array-Grenzen hinaus Dateien einfügen willst.
3. Mache FileArray als lokale Variable und übergebe es als Parameter an OpenDir.
4. Parameter mit "_" anfangen zu lassen ist schlechter Stil
5. Die Namen der Felder einer Klasse sollten mit einem kleinen Buchstaben anfangen.
AeroX - Do 03.04.08 13:00
Vielen Dank für die umfangreiche Hilfe!
noch ne kleine Frage:
wenn ich das so mache, wird dann die Datei beim Kompilieren mit eingeschlossen, oder beim starten des Programmes?
Christian S. - Do 03.04.08 14:15
Die DLL wird nicht einkompiliertt, Du musst sie mit ausliefern und beim Starten des Programmes wird danach gesucht (oder bei erster Benutzung? :gruebel: Bin gerade unsicher, wird für Dich aber wahrscheinlich nicht so wichtig sein)
AeroX - Do 03.04.08 14:39
alles klar,
und wie mache ich eine unmanaged-DLL?
Christian S. - Do 03.04.08 14:42
Mit einer Sprache, die nativen Code ausspuckt. Also z.B. Delphi, dafür müsstest Du noch nichtmal die Community wechseln, denn wir haben in der Entwickler-Ecke neben dem C#-Forum ja auch das Delphi-Forum ;-)
AeroX - Do 03.04.08 17:55
und wie kann ich dann z.B. mit einer if-anweisung eine Datei einlesen?
also
if (...) { Import-dll }
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!