# c# dll funktion aufrufen/definieren



## BLACKDIMMU (30. April 2007)

hi

ich bin jetzt zu visual c# gekommen
und will eine funktion aus einer dll (die nicht von mir stamd) aufrufen
grob gesagt wie mache ich das?
also die funktion sollte in einer klasse definiert werden
so weit bin ich schon
aber wie weiter?
also das soll passieren:

das program soll die dll ansprechen,
 die wiederum das angeschlossene interface fragt welche seriennummer es hat

 und diese seriennummer gibt die dll weiter an das program, die in einem "platzhalter"/funktion gespeichert

also wie spreche ich nun die dll an, und übermittler ihr das sie die funktion GetAllConnectedInterfaces
ausführen soll?

hmm ich hoffe ich konnte verständlich machen was ich machen will


----------



## skicu (30. April 2007)

Du kopierst die DLL in einen BIN Unterordner deines Projekts und fügst sie dann noch als Ressource zum Projekt hinzu.

Dann kannst du alle darin enthaltenen Funktionen über den Object Browser ansehen und im normalen Quellcode über den vollen Namensraumpfad ansprechen.


----------



## BLACKDIMMU (30. April 2007)

skicu am 30.04.2007 16:42 schrieb:
			
		

> Du kopierst die DLL in einen BIN Unterordner deines Projekts und fügst sie dann noch als Ressource zum Projekt hinzu.
> 
> Dann kannst du alle darin enthaltenen Funktionen über den Object Browser ansehen und im normalen Quellcode über den vollen Namensraumpfad ansprechen.



hmm *probieren..... nix finden*
also ich benutze die eingedeutschte version von viual c# express
und ich vermute das die dll mit einer anderen sprache geschrieben wurde (was doch eigenlich egal ist oder?)

sorry das hätte ich davor noch schreiben sollen


----------



## skicu (30. April 2007)

Das ist egal.

Du hast doch irgendwo in Dokumente und Einstellungen\User\... ein Verzeichnis, in dem dein Projekt liegt?
Darin erstellst du ein "BIN" Verzeichnis und kopierst die dll dahinein.

In Visual Studio englisch gibts einen Punkt, wenn du rechts auf dein Projekt klickst, namens "Add Ressource" - nehme mal an, dass das im deutschen dann "Ressource hinzufügen" oder ähnlich heißt. Hier wählst du dann den Pfad, in dem deine dll dann liegt (der Projektpfad) und fügst damit die Datei dann dem Projekt hinzu.


----------



## DJ_of_Borg (30. April 2007)

skicu am 30.04.2007 17:16 schrieb:
			
		

> Das ist egal.
> 
> Du hast doch irgendwo in Dokumente und Einstellungen\User\... ein Verzeichnis, in dem dein Projekt liegt?
> Darin erstellst du ein "BIN" Verzeichnis und kopierst die dll dahinein.
> ...


Theoretisch müsste man sich den ersten Schritt (kopieren ins BIN-Verzeichnis) auch sparen können und die Ressource von einem anderen Ort aus einbinden können, die wird dann beim kompilieren automatisch ins BIN-Verzeichnis kopiert.
Den "Add Reference"-Menüpunkt gibts übrigens auch im Menü unter "Projekt".


----------



## skicu (30. April 2007)

DJ_of_Borg am 30.04.2007 18:33 schrieb:
			
		

> Theoretisch müsste man sich den ersten Schritt (kopieren ins BIN-Verzeichnis) auch sparen können und die Ressource von einem anderen Ort aus einbinden können, die wird dann beim kompilieren automatisch ins BIN-Verzeichnis kopiert.
> Den "Add Reference"-Menüpunkt gibts übrigens auch im Menü unter "Projekt".


Ok, das kann sein. Ich arbeite eigentlich nur mit ASP.NET Projekten und dort würde dann auf die andere Datei nur verlinkt - da ist kopieren dann schon sinnvoll...


----------



## BLACKDIMMU (30. April 2007)

ok ich konnte die dll nun ohne fehlermeldung einbinden, als ellement wenn ich mich recht erinnere
nur nach funktionen druchsuchen klappt nicht (kann das sein das das gespert ist?/werden kann?)

ich hab mit der dll auch ein paar funktionsvorschlage bekommen (also in der textbeschreibung dafür)


			
				usbdmx.txt schrieb:
			
		

> usbdmx.dll - Schnittstelle:
> 
> 
> -----------
> ...


----------



## DJ_of_Borg (30. April 2007)

Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:


```
public partial class Form1 : Form
{
    [DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);

    public Form1()
    {
        InitializeComponent();
        Test();            
    }

    private void Test()
    {
        char[] c = new char[32];
        GetAllConnectedInterfaces(c);
    }
}
```

Das kompiliert und läuft durch, ohne zu crashen. Viel mehr kann ich aber nicht sagen, hab keine Platine zum anschliessen und sehen, ob das Ergebnis Sinn macht^^
Problem ist folgendes: Das mitgelieferte Beispiel ist C++, und davon hab ich wenig Ahnung. Die GetAllConnectedInterfaces-Funktion will eigentlich nen Pointer, sowas gibts aber in C# nicht - ich habs mal mit ref und out versucht, da hauts mir aber das Programm um die Ohren (nichtmal try-catch fängt das ab^^). Deswegen weiß ich nicht, ob das so überhaupt was zurückliefern kann. Zweites Problem: ob das jetzt wirklich ein char[32] ist, wage ich zu bezweifeln. Im Beispiel steht das hier drin:


```
typedef char TSERIAL[16];
typedef TSERIAL TSERIALLIST[32];

typedef void (STDCALL* TGetAllConnectedInterfaces) (TSERIALLIST* SerialList);
TGetAllConnectedInterfaces GetAllConnectedInterfaces;
```

Kann vielleicht einer entsprechend anpassen, der Ahnung von C++ hat


----------



## skicu (1. Mai 2007)

Ich dachte, du redest von einer Managed Code DLL?

Wenn du eine Win32 DLL hast, musst du völlig anders vorgehen. Habe ich aber selbst noch nicht gemacht. Sieh dich mal in den Google Groups um.


----------



## BLACKDIMMU (2. Mai 2007)

DJ_of_Borg am 30.04.2007 22:24 schrieb:
			
		

> Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:
> 
> 
> ```
> ...



hmm da ich c# anfanger bin kann ich es nicht genauer beschreiben, ich hab deinen code obend kopiert 
und unter verweis das bin verzeichnis angegeben wo die usbdmx.dll ist
aber der compiler sagt mir 

Fehler	2	Der Typ- oder Namespacename "DllImport" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?)	g:\dmx program\c sharp\pro1\WindowsApplication2\WindowsApplication2\Form1.cs	13	10	WindowsApplication2

hmm wie hast du sie ins program eingebunden?

naja ich lerne das ganze grade darum dauert es seinen zeit bis ich mich mit den einzelnen problemen befasse

wegen den pointer
es ist ein "lowcost" dmx/usb/dmx interface 
ähm dmx ist ein daten-protocol in der lichttechnik (für die die es nicht wissen)
 als solchen kann es nur 512dmx kanäle ansprechen (oder anders ausgedrückt eine dmx leitung versorgen) bei grossen lichtanlagen reicht das aber machmal nicht aus darum gibt es die möglichkeit mehrer interface-geräte anzuschliessen und paralell zu betreiben, ich denke das steckt dahinter


----------



## DJ_of_Borg (2. Mai 2007)

BLACKDIMMU am 02.05.2007 22:08 schrieb:
			
		

> hmm da ich c# anfanger bin kann ich es nicht genauer beschreiben, ich hab deinen code obend kopiert
> und unter verweis das bin verzeichnis angegeben wo die usbdmx.dll ist
> aber der compiler sagt mir
> 
> Fehler	2	Der Typ- oder Namespacename "DllImport" konnte nicht gefunden werden. (Fehlt eine using-Direktive oder ein Assemblyverweis?)	g:\dmx program\c sharp\pro1\WindowsApplication2\WindowsApplication2\Form1.cs	13	10	WindowsApplication2


Geh mal mit dem Cursor irgendwo in das DllImport (im Code), dann erscheint unten Rechts am Wort ein roter Strich. Da mit der Maus drüber und die obere der beiden Optionen wählen.

Alternativ (bzw. manuell) bei den usings

using System.Runtime.InteropServices;

einfügen.


----------



## DJ_of_Borg (2. Mai 2007)

BLACKDIMMU am 02.05.2007 22:08 schrieb:
			
		

> wegen den pointer
> es ist ein "lowcost" dmx/usb/dmx interface
> ähm dmx ist ein daten-protocol in der lichttechnik (für die die es nicht wissen)
> als solchen kann es nur 512dmx kanäle ansprechen (oder anders ausgedrückt eine dmx leitung versorgen) bei grossen lichtanlagen reicht das aber machmal nicht aus darum gibt es die möglichkeit mehrer interface-geräte anzuschliessen und paralell zu betreiben, ich denke das steckt dahinter


Nee, das hat mit Pointer nix zu tun. Ein Pointer ist quasi ein "Zeiger" auf einen Speicherberich. In C++ (und anderen Sprachen) kann man damit locker wild im Speicher rumschreiben (und lesen), was einerseits vieles Ermöglicht, andererseits aber auch viel Vorsicht erfordert, weil man da eben genauso locker in Bereiche schreiben kann, in denen noch was anderes wichtiges steht^^
In C# gibts das jedenfalls nicht, das bei der DLL mitgelieferte Beispiel nutzt das aber (und die dll intern wahrscheinlich auch), so daß man das in einem C#-Programm eben anpassen muss. Gehen tut das, ich kann blos so ohne weiteres nicht sagen wie, und zum ausprobieren bräucht ich halt so ne Platine.


----------



## BLACKDIMMU (22. Juli 2007)

DJ_of_Borg am 30.04.2007 22:24 schrieb:
			
		

> Mir scheint, das einbinden ins Projekt war nicht nötig. Hab mir die DLL mal runtergeladen und rumprobiert, folgendes kam raus:
> 
> 
> ```
> ...


----------



## DJ_of_Borg (22. Juli 2007)

BLACKDIMMU am 22.07.2007 21:38 schrieb:
			
		

> und da viel mir persönlich eine logik frage ein, woher weis der kompiler das er das GetAllConnectedInterfaces in der dll suchen muß?


Das weiß er wegen

```
[DllImport("usbdmx.dll")]
    public static extern void GetAllConnectedInterfaces(char[] result);
```

Warum da aber jetzt nix rauskommt, keine Ahnung, aber das werd ich ohne ein "connected interface" wohl auch nicht ausprobieren können :o


----------



## Herbboy (22. Juli 2007)

nur mal frage OT: wie spricht man das eigentlich aus? "Zeh Raute"...? "Si Nammba"...? als programmier-laie kannte ich bisher nur C++


----------



## DJ_of_Borg (22. Juli 2007)

Herbboy am 22.07.2007 23:12 schrieb:
			
		

> nur mal frage OT: wie spricht man das eigentlich aus? "Zeh Raute"...? "Si Nammba"...? als programmier-laie kannte ich bisher nur C++


Si Sharp


----------



## Herbboy (22. Juli 2007)

DJ_of_Borg am 22.07.2007 23:23 schrieb:
			
		

> Herbboy am 22.07.2007 23:12 schrieb:
> 
> 
> 
> ...


ach, das # heißt echt sharp? hab ich auch noch nie gehört.

thx


----------

