2009-04-27 6 views
2

nicht finden Ich bin beschäftigt, ein kleines bisschen C/C++ kennen zu lernen, und mit C# interop. Ich habe einige Beispiele für die Erstellung einer einfachen Win32-DLL und die Verwendung dieser von C# überprüft, aber wenn ich versuche, in meine DLL aufrufen, bekomme ich den Laufzeitfehler: "Es ist nicht möglich, einen Einstiegspunkt namens TestFunc zu finden". Meine DLL wie folgt aussehen, und ich schaffte es aus einem Projekt Win32-DLL, die mit der leeren Projekt Option:DLL-Funktion nicht exportiert: Kann einen Einstiegspunkt namens TestFunc

Rubrik:

__declspec(dllexport) int TestFunc(char *, char *, char *); 

-Code-Datei:

#include "stdafx.h" 
#include "TestLib.h" 

__declspec(dllexport) int TestFunc(char *arg1, char *arg2, char *arg3) 
{ 
    char str1[] = "Brady Kelly"; 
    char str2[] = "Hello World"; 
    char str3[] = "1234567890"; 

    strcpy(arg1, str1); 

    return 128; 
} 

Was mache ich falsch ?

+0

Ich glaube, "1800 INFORMATION" löst das Problem, aber wie haben Sie die Funktion im C# -Projekt deklariert? –

+0

@Ahmed, ich erkläre es wie folgt: [DllImport ("TestLib.dll")] öffentliche statische extern int TestFunc (StringBuilder arg1, StringBuilder arg2, StringBuilder arg3); – ProfK

Antwort

6

Wird Ihre Funktion mit C- oder C++ - Bindungen kompiliert? Du spezifizierst es nicht, aber es sieht für mich so aus, als ob es eine Möglichkeit gibt, dass du den C++ - Compiler verwendest - der Compiler verwendet einen sehr unterschiedlichen Namensmangel vom C-Compiler und du wirst den Namen "TestFunc" einfach nicht finden können als ob Sie den C-Compiler oder C-Namen-Mangling-Regeln verwenden würden.

einfach zu sagen, der C++ Compiler Regeln Mangeln C-Namen zu verwenden, wird diese Datei in der Kopfzeile verwenden: Auch

extern "C" 
{ 
    __declspec(dllexport) int TestFunc(char *, char *, char *); 
} 
+0

Zeigt dir nur, ich war mir nicht einmal bewusst Namen Mangling. Vielen Dank! – ProfK

+0

Genau das, was ich brauchte! –

2

, nur den declspec vor der Funktionsdeklaration muß (in der Header-Datei) , nicht die Definition. Ein nützliches Tool zum Untersuchen, was aus der DLL exportiert wird und von dem die DLL abhängt, ist Dependency Walker.

2

Eigentlich, da Sie diese Frage als C markiert haben, würde ich eine kleine Änderung vorschlagen, aus dem, was 1800 INFORMATION Lösung:

#ifdef __cplusplus 
extern "C" { 
#endif 

#ifdef EXPORT_MODE 
#define METHODTYPE __declspec(dllexport) 
#else 
#define METHODTYPE __declspec(dllimport) 
#endif 

#ifdef __cplusplus 
} 
#endif 

/*! _The_ method */ 
METHODTYPE int TestFunc(char *, char *, char *); 

Auf diese Weise können Sie den gleichen Header verwenden, um sowohl in der Kunden-Code und Code .

Hinweis: Dependency Walker ist nicht mehr im Lieferumfang von VS2008 enthalten. Sie müssen es herunterladen, wenn Sie VS2008 verwenden.

Verwandte Themen