Native C Code in C#

Gast #4963952
Hallo,

eine bestehende C Konsolenapplikation soll via DLL in C# eingebunden 
werden.
Diese Konsolenapplikation beinhaltet eine Empfangs-Callback-Funktion wo 
die ankommenden Daten weiter verarbeitet werden sollen. Es handelt sich 
hierbei um UDP Nachrichten. Wie wird der Empfangs-Callback-Funktion in 
der DLL verpackt so dass in C# auf diese Daten zugegriffen werden kann?
Gast #4964113
Was müsste ich tun damit die Daten in der Callbackfunktion OnRecieveCLB 
per dllexport Anweisung weitergereicht werden?
1
void OnReceiveCLB(void)
2
{
3

4
}
Gast #4965673
Das Empfangen von Daten funktioniert nun. Jetzt habe ich allerdings ein 
weiteres Problem. Ich möchte jetzt Daten vom Hauptprogramm generieren 
und in der Send Methode benutzen. Der Empfangspuffer von der Gegenstelle 
ist leer.
1
int test = 0;
2

3
int main(void)
4
{
5
  test = 50;
6

7
  for (int i = 0; i < 100; i++)
8
  {
9
    UdpFrameBuffer[i] = 0x34;
10
  }
11

12
  return 0;
13
}
14

15
__declspec(dllexport) void Send(void)
16
{
17

18
    UPort->Send(UdpFrameBuffer, 50);
19
}
Gast #4965810
Ich versteh die Frage nicht ganz - aber die erste Antwort enthaelt doch 
schon alle technischen Mitteln um einen Callback oder einen 
Funktionsaufruf zu realisieren - ansonsten google
Gast #4965823
Ich habe intern (C Code) eine Funktion mit der ich ein UDP Frame 
generiere.
Diese Funktion beinhaltet sämtliche Strukturen. Das ganze soll nur 
intern benutzt werden.
Gast #4965898
>Wird überhaupt ein Einstiegspunkt void main(void) verwendet?

Nein main wird nicht verwendet - das siehst du wenn du deine dll 
debuggst oder ein printf einbaust

und das kann dir auch google beantworten
Gast #4966471
Ok.

Allerdings soll in der Funktion Send bevor die Daten per UDP versendet 
werden, durch die Funktion GenerateData generiert werden. Diese Funktion 
beinhaltet ebenso weitere Funktionen sowie Strukturen.

__declspec(dllexport) void Send(void)
{
  GenerateData Data;
  GenerateFrame(&Data);
  UPort->Send((char*)&Data, sizeof(data_t));
}
Gast #4966493
>Allerdings soll in der Funktion Send bevor die Daten per UDP versendet
>werden, durch die Funktion GenerateData generiert werden. Diese Funktion
>beinhaltet ebenso weitere Funktionen sowie Strukturen.

Das ist schön - ist das jetzt eine Frage oder ein Statement?

Tips:
1. triviale Fragen mit google lösen
2. Fragen auch als Fragen formulieren - mit ?
Gast #4966551
Wenn in der Send Funktion NUR
1
  GenerateData Data;
2
  GenerateFrame(&Data);

ausgeführt wird erscheint in der C# Applikation folgende Meldung:

Fehlermeldung:

Ein Ausnahmefehler des Typs "System.AccessViolationException" ist in 
TestProgram.exe aufgetreten.

Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu 
lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass 
anderer Speicher beschädigt ist.
Gast #4966573
Auf diese Frage gibt es keine trivial Antwort - der Fehler liegt in 
deinem Code und kann aus x Richtungen kommen - bei manage<->nativ fehlen 
die alle normalen Schutzprinzipien von .Net d.h. du erzeugt mit Unwissen 
nicht nachvollziehbare Fehler - da kommt keine .Net Exception mehr dir 
dir fast direkt sagt was das Problem ist - damit ist es vorbei - zu 100%

Tip:
1. schreib deinen vollständigen Ablauf in C - mit den exportierten 
Funktionen und nutzen diese Funktionen in deinem nativen Testprogramm 
bis alles 100% funktioniert - davor nicht mal im Traum an einen wechsel 
zu .Net nachdenken

du kannst dein Programm als DLL(DllMain...) oder als EXE(main) 
kompilieren - einfach als EXE kompilieren und deinen Funktionen die du 
exportieren willst sauber testen

2. beim Import die Calling-Convention beachten

3. darauf achten das in C# ein Speicherbereich nicht zwangsweise an der 
Stelle bleibt (in C muss das aber so sein) d.h. vielleicht den 
Gargbage-Collector Anweisen einen Speicher nicht zu verschieben - 
Pinning/fixed
Gast #4966646
Ich habe nun das eigentliche Problem gefunden.

Ein Übergabeparameter uint8_t address[6] wurde nur eine 0 übergeben.
Nun habe ich ein Dummy Array erzeugt und dieses der Funktion übergeben.
Gast #4966673
>Ich habe bereits ein funktionierendes Programm. Da sehe ich keine Fehler
>oder Warnungen.

bei nativ bedeutet das eben nicht das alles in Ordnung ist

>memcpy(tTelegram.u8MacAddress, u8MacAddress, 6);

solltes du lieber so schreiben

memcpy(tTelegram.u8MacAddress, u8MacAddress, sizeof(u8MacAddress));

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.