Laden...

DLL in C# verwenden...

Erstellt von ImNotInThatMood vor 20 Jahren Letzter Beitrag vor 20 Jahren 3.501 Views
I
ImNotInThatMood Themenstarter:in
4 Beiträge seit 2004
vor 20 Jahren
DLL in C# verwenden...

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)

Quellcode der DLL (TestFunktionen_cpp.cpp):


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


Quellcode des Headers (TestFunktionen_cpp.h):


#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


Quellcode der C#-Main (Main.cs):


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...

F
529 Beiträge seit 2003
vor 20 Jahren

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

I
ImNotInThatMood Themenstarter:in
4 Beiträge seit 2004
vor 20 Jahren
DLL in C# verwenden

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...

F
529 Beiträge seit 2003
vor 20 Jahren

Kein Problem....

Besuchen sie das VisualC++ - Forum

H
704 Beiträge seit 2003
vor 20 Jahren

** 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 **

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
V
842 Beiträge seit 2003
vor 20 Jahren

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