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ß
Zusatz Wenn du eine Funktion int test(int a) hast, kann du diese mit public static extern int test(int a); deklarieren.
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?
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 | }
|
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ß
wie sieht denn dein c-header aus? wenn du den ganzen code posten würdest, könnte dir effektiv geholfen werden.
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
|
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.