Native C Code in C#

Gast #4963952
Lesenswert?

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 #4965673
Lesenswert?

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 #4965898
Lesenswert?

>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
Lesenswert?

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
Lesenswert?

>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
Lesenswert?

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
Lesenswert?

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 #4966673
Lesenswert?

>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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren