Hallo zusammen,
ich habe eine Frage bezüglich der Verwendung eigens
erstellter DLL bzw. der enthaltenen Funktionen in C#.
Ich habe eine DLL erstellt, die eine Funktion
int Addieren(int,int)
beinhaltet.
Diese Funktion möchte ich innerhalb eines C#-Codes
aufrufen.
Die DLL habe ich bereits getestet. Unter dem C++Builder 5.0
habe ich ein Projekt erstellt, indem ich die DLL einbinde
und die Funktion Addieren() verwende. Funktioniert alles
bestens.
Nun möchte ich die DLL auch in C# verwenden. Das Einbinden
einer System-DLL (msvcrt.dll) und das verwenden einer ihrer
Funktionen (puts()) klappt bestens.
Wenn ich nun meine DLL einbinde akzeptiert der Compiler (SharpDevelop 0.90)
das.
Verwende ich jedoch die darin enthaltene Funktion Addieren(),
so ergibt sich ein Laufzeitfehler: EntryPoint not found...
Ich nehme an, daß der Funktionsname "Addieren" nicht der
exakte Name der Funktion ist.
Hier noch die Quellcodes der entsprechenden Dateien (.cpp, .h, .cs)
#include <condefs.h>
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "TestFunktionen_cpp.h"
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
return 1;
}
int EXTERN __export __stdcall Addieren(int summand1, int summand2)
{
return (summand1 + summand2);
}
#ifndef _TESTFUNKTIONEN_H
#define _TESTFUNKTIONEN_H
#ifdef __DLL__
# define DLL_EXP __declspec(dllexport)
#else
# define DLL_EXP __declspec(dllimport)
#endif
#ifdef __cplusplus
#define EXTERN extern
#else
#define EXTERN extern "C"
#endif
// EXTERN int DLL_EXP Addieren(int,int);
EXTERN int __export __stdcall Addieren(int,int);
#endif
using System;
using System.Runtime.InteropServices;
class PlatformInvokeTest
{
[DllImport("msvcrt.dll")]
public static extern int puts(string c);
[DllImport("msvcrt.dll")]
internal static extern int _flushall();
[DllImport("TestFunktionen_bpr.dll", EntryPoint="Addieren")]
public static extern int Addieren(int a,int b);
public static void Main()
{
Addieren(7, 8);
puts("Hallo...\n\n");
_flushall();
}
}
Die Frage ist also, wieso puts() akzeptiert wird und Addieren() nicht?!
Was ist der Trick?
Hoffe jemand kann mir helfen... danke.
Ich träumt mir wär so klar...
Ich habe eingentlich keine Ahnung, bei mir, wenn ich C-Dlls anbinde gehts so wie du es gemacht hast sehr gut... aber lass doch mal das EntryPoint-Zeuch weg.
Oder es liegt echt an der Dll! Ich kenn mich mit C++ nicht so toll aus, aber was soll denn das __extern und __stdcall? Hat das was mit der Stdlib zu schaffen?
Mit dem Source für ne Dll hats geklappt, geht mit dem Visual TurboC 🙂 zu kompillieren:
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" _declspec(dllexport) int Addiere(int x, int y)
{
return x+y;
}
ist aber auch c, falls du das in C++ brauchst kann ich nicht helfen....
dein C# Quelltext passt soweit...
--
mfg
Franknstein
Besuchen sie das VisualC++ - Forum
Franknstein...
... du bist der Held!
Du hast mir zwar nicht direkt geholfen, aber indirekt.
Deine Frage nach __export und __stdcall hat mich dazu animiert
mal nachzuforschen. Unter der Hilfe des C++-Builders findet man
hierzu:
Konventionen
Modifizierer Push-Parameter Pop-Parameter Namensveränderung (nur in C)
__cdecl Von rechts nach links Aufrufender '_' vorangestellt
__fastcall Von links nach rechts Aufgerufener '@' vorangestellt
__pascal Von links nach rechts Aufgerufener Großbuchstaben
__stdcall Von rechts nach links Aufgerufener Keine Veränderung
__cdecl: Dies ist die Standardeinstellung.
Hinweis: __fastcall und __stdcall werden in C++ für die Namensergänzung verwendet.
Daraufhin habe ich dann __stdcall in der DLL weggelassen.
Nun gilt die Standardeinstellung und aus dem EntryPoint "Addieren" wird "_Addieren"!
Und siehe da - jetzt klappts auch mit dem Nachbarn.
Vielen Dank für deine Hilfe.
Ich träumt mir wär so klar...
** Beitrag verschoben. Bitte keine Beiträge im FAQ schreiben. Danke. Falls jemand einen Vorschlag für einen FAQ Beitrag hat, kann er sich gerne bei einem Moderator melden **
Hi!
@hauptmann:
Dieser Thread wurde von mir dorthin verschoben, da ich ihn sehr gut finde. Man sieht nämlich mal auf was man bei der Verwendung von C++-DLLs achten muss, wenn man diese in C# verwenden will und man kann anhand des Codes auch sehen wie sie überhaupt verwendet werden.
Ich füge nächste mal einen Hinweis an!
EDIT: Außerdem kann man es auch so einstellen das nur Mods rechte haben die über das Lesen hinausgehen in einzelnen Foren, könnte man für die FAQ einrichten.
Code-Hacker