mikrocontroller.net

Forum: PC-Programmierung Dll in C# einbinden


Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe in einem Visual Studio 2005 Win32 Template eine Funktion erstellt 
und das Modul als *.Dll compiliert.

In einer C# GUI Anwendung möchte ich nun auf die Funktion in der *.Dll 
zugreifen.

Nun weiß ich nicht, wie ich die *.Dll in C# einbinden soll.

Vielleicht kann mir da jemand weiterhelfen.


Danke und Gruß

Autor: Bastian Kriebel (triple2448)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
[DllImport("xxx.dll")] und Funktion als extern einbinden

Autor: bla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zusatz
Wenn du eine Funktion int test(int a) hast, kann du diese mit
public static extern int test(int a); deklarieren.

Autor: Dieter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also irgendwie tu ich mir da wohl etwas schwer.
Komme von c und da läufts hier noch unrund.

Im Konstruktor ist der DllImport denke ich soweit richtig.

Nun sollte eigentlich, wenn der button1_Click betätigt wird, die 
Funktion in der Dll aufgerufen werden.

Bekomme folgende Fehlermeldungen:

The name 'DllImport' does not exist in the current context

The name 'Lowlevel01' does not exist in the current context


Lowlevel01.dll liegt im gleichen Ordner wie Program.cs.

Das einbinden der dll unter Add References geht nicht.

Was mache ich falsch?

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DllImport ist ein Attribut, das direkt vor jeder extern deklarierten 
Funktion stehen muss.

[DllImport("Kernel32.dll")]
public static extern UInt32 GetTickCount();

u.U. noch das passende using System.Runtime.InteropServices hinzufügen
und das ganze dann in eine eigene Klasse verpacken z.B.
class Kernel32 {
    [DllImport("Kernel32.dll")]
    public static extern UInt32 GetTickCount();
}

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht immer noch nicht :o(


Meine Funktion in C sieht wie folgt aus.

extern int Funktion(int, int)
{

}

Das Ding ist als *.dll Compiliert.



In meiner Applikationsebene in C# ist die *.dll nun scheinbar richtig 
eingebunden. Jedenfalls bekomme ich beim builden keine Fehlermeldung.

Beim debuggen bleibt mir das Ding am Funktionsaufruf mit folgender 
Fehlermeldung stehen:

"Unable to find an entry point named 'Funktion' in DLL 
'Lowlevel01.dll'."

Nu, da muß ja wohl was mit der C Funktion nicht passen.

Danke für jeden Tip und Gruß

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sieht denn dein c-header aus?

wenn du den ganzen code posten würdest, könnte dir effektiv geholfen 
werden.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es fehlt wahrscheinlich
__declspec(dllexport) void __cdecl Funktion(int, int);

und/oder das übliche extern "C" um die Deklaration herum
#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void __cdecl Funktion(int, int);
#ifdef __cplusplus
}
#endif

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace WindowsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }


    public class C_Test
    {

        [DllImport("Lowlevel01.dll")]
        public static extern int Flaeche(int s32_wert1, int s32_wert2);



    }

}






------------------------------------------------------------------------ 
-




        private void button1_Click(object sender, EventArgs e)
        {

            s32_erg = C_Test.Flaeche(2, 4);



            textBox1.Text = Convert.ToString(s32_erg);

        }


------------------------------------------------------------------------ 
-


Der header sieht so 
aus--------------------------------------------------




int Flaeche( int  s32_wert1, int s32_wert2);



und das *.c file kommt nun---------------------------------------------



#include "Berechnung.h"




int Flaeche(int s32_wert1, int s32_wert2)
{
  int s32_flaeche;

  s32_flaeche = s32_wert1 * s32_wert2;




  return(s32_flaeche);

}






Also, würde mich freuen, wenn ihr mir da weiterhelfen könntet.

Danke und Gruß

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es liegt sehr wahrschienlich am Header. Änder den mal so:



// DLL EX - / IM - port halt
#if defined DLL_EXPORT
#define DECLDIR __declspec(dllexport)
#else
#define DECLDIR __declspec(dllimport)
#endif


// Prototypen
extern "C"
{
DECLDIR int Flaeche( int  s32_wert1, int s32_wert2);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.