2009-03-17 8 views
17

Ich habe eine DLL, die von einer dritten Partei stammt, die in C++ geschrieben wurde. Hier einige Informationen, die von der DLL-Dokumentation kommt:"Kann einen Einstiegspunkt namens [Funktion] in dll" (C++ zu C# Typ Konvertierung) nicht finden

//start documentation 

RECO_DATA{ 
wchar_t Surname[200]; 
wchar_t Firstname[200]; 
} 

Beschreibung: Datenstruktur die Funktion Ergebnis für die Aufnahme. Alle Funktionsergebnisse werden als Unicode (UTF-8) gespeichert.

Methode:

bool recoCHN_P_Name(char *imgPath,RECO_DATA *o_data); 

Input:

char * imgPath 

der vollständige Pfad des Bildpunktes für diese Funktion

RECO_DATA * o_data 

Datenobjekt zu erkennen, für die Funktion Ergebnis Empfang . Funktion return: True wenn Erfolg, sonst false wird zurückgegeben.

//end documentation 

Ich versuche, den recoCHN_P_Name aus meiner C# -Anwendung aufzurufen. Zu diesem Zweck kam ich mit diesem Code auf:

Der Code der DLL zu importieren:

public class cnOCRsdk 
{ 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct RECO_DATA{ 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst=200)] 
     public string FirstName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 200)] 
     public string Surname; 
     } 

    [DllImport(@"cnOCRsdk.dll", EntryPoint="recoCHN_P_Name")] 
    public static extern bool recoCHN_P_Name(byte[] imgPath, RECO_DATA o_data); 
} 

Der Code zum Aufruf der Funktion:

  cnOCRsdk.RECO_DATA recoData = new cnOCRsdk.RECO_DATA(); 

     string path = @"C:\WINDOWS\twain_32\twainrgb.bmp"; 

     System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
     byte[] bytes = encoding.GetBytes(path); 

     bool res = cnOCRsdk.recoCHN_P_Name(bytes, recoData); 

und der Fehler Ich erhalte ist "" Kann einen Einstiegspunkt mit dem Namen 'recoCHN_P_Name' in der DLL 'cnOCRsdk.dll' nicht finden. " Ich vermute, dass ich einen Fehler beim Konvertieren eines Typs von C++ nach C# habe. Aber wo genau ...

Antwort

29

Zuerst sicherstellen, dass die Funktion tatsächlich ausgeführt wird:

in der Visual Studio-Eingabeaufforderung verwendet dumpbin /exports whatever.dll

+0

Ich habe eine Zeile in der Ausgabe, die sagt „14 D 00007B40 recoCHN_P_Name @ CcnOCRsdk @@ QAE_NPADPAURECO_DATA @@@ Z " was sagt mir das? – Evgeny

+3

Eine detaillierte Erklärung zur Entschlüsselung finden Sie unter http://www.kegel.com/mangle.html. Stellen Sie sicher, dass die Datentypen korrekt sind. –

+0

Das hat mich definitiv in die richtige Richtung gelenkt, danke – Evgeny

15

C# nicht C++ Namen Mangeln und Sie müssen entweder unterstützt die C++ Funktionen erklären, mit

extern "C" {...} 

(möglicherweise keine Option, wenn sie von einer Drittpartei stammen), oder rufen Sie den verfälschten Namen direkt auf, wenn Sie es zur Arbeit bringen können. Es kann einfacher sein, die dritte Partei dazu zu bringen, eine nicht manipulierte Schnittstelle zur Funktionalität bereitzustellen.

+0

Ihre Antwort hat meinen Tag gerettet. –

3

Ich würde einen Wrapper mit C++/CLI schreiben. Dieser Wrapper kann die .h-Dateien und die Verknüpfung zu den .lib-Dateien enthalten, die Sie vom Drittanbieter erhalten haben. Dann ist es einfach und sicher, eine verwaltete Schnittstelle für Ihr C# -Programm zu schreiben.

15

Gelöst - zumindest bis zu dem Punkt, wo das Programm nicht bricht und mir tatsächlich einen bool Wert zurückgibt.

Der Schlüssel, glaube ich, war den Eintrittspunkt als ‚verstümmelter‘ Name

[DllImport(@"cnOCRsdk.dll", EntryPoint="[email protected]@@[email protected]@@Z")] 
    public static extern bool recoCHN_P_Name(ref string imgPath, ref RECO_DATA o_data); 

Danach angeben habe ich einige Fehler, aber die ‚nicht in der Lage Einstiegspunkt zu finden‘ ging.

+0

Das hat mein Problem gelöst! Vielen Dank! – user20493

0

Sie könnten versuchen, den unmangled Namen während einer Calling im

0

Correct Entrypoint String DllImport Angabe könnte in „Lib“ Datei gefunden werden, die zusammen mit Haupt unmanaged dll kommt.

1

ich das gleiche Problem in diesen Schritten gelöst:

Schritt 1) ​​ Wenn Sie Ihre benutzerdefinierte DLL in C++ programmieren Visual Studio verwenden, dann auf der Eigenschaftenseite des Projekts stellen Sie den Common Language Runtime Support (/clr) Parameter Common Language Runtime Support (/clr).

Schritt 2) Zur Verzögerung in .h Datei __declspec(dllexport) Schlüsselwörter wie unter Verwendung Funktion:

__declspec(dllexport) double Sum(int a,int b); 

Schritt 3) Erstellen und Export DLL-Datei, dann verwenden Sie die Dependency Walker Software, um Ihre Funktion zu erhalten EntryPoint.

step4) Import DLL-Datei in dem C# Projekt und setzen Entrypoint und Calling Variable wie folgt:?

[DllImport("custom.dll", EntryPoint = "[email protected]@[email protected]", CallingConvention = CallingConvention.Cdecl)] 

    public static extern double Sum(int a,int b);