Forum: PC-Programmierung Dll in C# einbinden


von Dieter (Gast)


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ß

von Bastian K. (triple2448)


Lesenswert?

[DllImport("xxx.dll")] und Funktion als extern einbinden

von bla (Gast)


Lesenswert?

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

von Dieter (Gast)


Angehängte Dateien:

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?

von Arc N. (arc)


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.
1
class Kernel32 {
2
    [DllImport("Kernel32.dll")]
3
    public static extern UInt32 GetTickCount();
4
}

von Dieter (Gast)


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ß

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

wie sieht denn dein c-header aus?

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

von Arc N. (arc)


Lesenswert?

Es fehlt wahrscheinlich
__declspec(dllexport) void __cdecl Funktion(int, int);

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

von Dieter (Gast)


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ß

von Willivonbienemaya .. (willivonbienemaya)


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);
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.