Laden einer C++ - DLL in C#
Ich versuche eine DLL verwenden, die wurde geschrieben in C++, aber meine Anwendung ist in C#
Die DLL von einer anderen Firma, aber Sie haben geliefert, ein SDK für Ihre software.
Geben Sie ein Beispiel, wie laden DLL in C++, aber ich brauche, um eine Anpassung an C#.
Unten Ihre Anweisungen, wie es zu tun in C++
MarkEzd.dll die Datei ist Dynamic Link Library.
MarkEzdDll.h ist die header-Datei der Export-Funktion in MarkEzd.dll
Den Aufruf Weg, MarkEzd.dll explizit link. Entwickler braucht, um zu laden und kostenlos MarkEzd.dll durch den Aufruf von Windows-API-Funktion.
Die Schritte sind wie folgt.
-
Aufruf von Windows-API-Funktion LoadLibrary() laden der DLL dynamisch;
-
Aufruf von Windows-API-Funktion GetProcAddrress (), um die Zeiger auf die Funktionen in der DLL, und verwenden Sie die Funktion, die Zeiger, die Arbeit zu beenden;
-
Aufruf von Windows-API-Funktion FreeLibrary() freigeben in der Bibliothek, wenn Sie nicht verwenden DLL oder das Programm endet.
Unten ist das Beispiel, das Sie zur Verfügung gestellt haben.
Schritt 2. Programm-software für den Aufruf markezd.dll.
a) Erster Schritt : Dynamische Last MarkEzd.dll
HINSTANCE hEzdDLL = LoadLibrary(_T("MarkEzd.dll"));
b) Zweiter Schritt: Holen Sie sich die Zeiger von der Funktion, die aufgerufen werden
lmc1_Initial=(LMC1_INITIAL)GetProcAddress(hEzdDLL, _T("lmc1_Initial"));
lmc1_Close=(LMC1_CLOSE)GetProcAddress(hEzdDLL, _T("lmc1_Close"));
lmc1_LoadEzdFile=(LMC1_LOADEZDFILE)GetProcAddress(hEzdDLL,_T("lmc1_LoadEzdFile"));
lmc1_Mark=(LMC1_MARK)GetProcAddress(hEzdDLL,_T("lmc1_Mark"));
c) Dritter Schritt: Aufruf der Funktion
1) Initialisierung lmc1 board: lmc1_Initial()
.
2) test Offen.ezd: lmc1_LoadEzdFile(_T(“test.ezd”))
.
3) Nennen lmc1_Mark() für die Bearbeitung von: lmc1_Mark()
.
4) Schließen lmc1 board: lmc1_Close()
.
d) Vierter Schritt, Release markezd.dll: FreeLibrary(hEzdDLL)
Balg ist in den Beschreibungen der Befehle.
lmc1_Initial
ABSICHT: initialisieren lmc1 control-board
DEFINITION: int lmc1_Initial(TCHAR* strEzCadPath, BOOL bTestMode, HWND hOwenWnd)
strEzCadPath: der vollständige Pfad, wo ezcad2.exe existiert
bTestMode, Ob im Testmodus oder nicht
hOwenWnd: das Fenster, Das den Fokus hat. Es wird verwendet, um die Benutzer zu überprüfen ist die stop-Meldungen.
BESCHREIBUNG: Sie müssen zuerst nennen lmc1_Initial, bevor andere Funktion im Programm.
Rückgabewert: Fehler: allgemeiner Fehler code
lmc1_Close
ABSICHT: in der Nähe lmc1-board
DEFINITION: int lmc1_Close();
BESCHREIBUNG: rufen Sie lmc1_Close zum schließen der lmc1 board, wenn exit-Programm.
Rückgabewert: Fehler: allgemeiner Fehler code
lmc1_LoadEzdFile
ABSICHT: öffnen Sie die bestellten ezd-Datei, und deaktivieren Sie alle Objekt in der Datenbank.
DEFINITION: int lmc1_LoadEzdFile(TCHAR* strFileName);
BESCHREIBUNG: mit dieser Funktion öffnen Sie eine ezd-Datei erstellen, indem Sie einen Benutzer als Vorlage. Benutzer brauchen nicht, stellen Prozessparameter ein, weil Sie geladen werden in der Vorlagen-Datei.
Rückgabewert: Fehler: allgemeiner Fehler code
lmc1_Mark
ABSICHT: markieren Sie alle Daten in der Datenbank
DEFINITION: int lmc1_Mark(BOOL bFlyMark);
bFlyMark= TRUE //mark on fly
BESCHREIBUNG: Beginnen markieren durch den Aufruf dieser Funktion wird nach dem laden ezd-Datei mit lmc1_LoadEzdFile. Die Funktion wird nicht zurück, bis die Markierung abgeschlossen ist.
Rückgabewert: Fehler: allgemeiner Fehler code
Sondern erklären auch, wie die Einrichtung VS6.0
- Wählen Sie "Microsoft Visual C++ 6.0", wenn die Installation von visual studio, und klicken Sie auf "Option Ändern".
- Wählen Sie "VC++ - MFC-und Template-Bibliotheken" und klicken Sie auf "Option Ändern".
- Wählen Sie "Microsoft Foundation Class Libraries" und klicken Sie auf "option ändern".
- Wählen Sie die Optionen, wie Folgendes Bild, und klicken Sie auf "OK".
- Öffnen Sie das Projekt, wählen Sie im Menü Projekt->Einstellungen. Wählen Sie "C/C++", "UNICODE" und löschen Sie "AUTOMATEN" in "Preprocessor definitions"
- Wählen Sie "Link", wählen Sie "Output" in der Kategorie, und fügen Sie "wWinMainCRTStartup" in "Entry-point" - symbol"
- "Alle ändern "char" zu "TCHAR" im source-code.
- Alle ändern, Zeichenkette enthalten, die durch doppelte Anführungszeichen "..." , _T("...")
- Kompilieren und verknüpfen Sie das Projekt erneut.
meisten Funktionen, die einen integer zurückgeben, code 0 für Erfolg.
Wäre das richtige?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Start_Mark
{
public partial class Form1 : Form
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
[DllImport("MarkEzd.dll")]
[return: MarshalAs(UnmanagedType.I2)]
public static extern int lmc1_Initial(string strEzCadPath, bool bTestMode, IntPtr hOwenWnd);
[DllImport("MarkEzd.dll")]
[return: MarshalAs(UnmanagedType.I2)]
public static extern int lmc1_Close();
[DllImport("MarkEzd.dll")]
[return: MarshalAs(UnmanagedType.I2)]
public static extern int lmc1_LoadEzdFile(string strFileName);
[DllImport("MarkEzd.dll")]
[return: MarshalAs(UnmanagedType.I2)]
public static extern int lmc1_Mark(bool bFlyMark);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
IntPtr hEzdDLL = LoadLibrary("MarkEzd.dll");
IntPtr iplmc1_Initial = GetProcAddress(hEzdDLL, "lmc1_Initial");
IntPtr iplmc1_Close = GetProcAddress(hEzdDLL, "lmc1_Close");
IntPtr iplmc1_LoadEzdFile = GetProcAddress(hEzdDLL, "lmc1_LoadEzdFile");
IntPtr iplmc1_Mark = GetProcAddress(hEzdDLL, "lmc1_Mark");
int intlmc1_Initial=lmc1_Initial("c:\temp", false, hEzdDLL);
if (intlmc1_Initial > 0)
{
return;
}
int intlmc1_LoadEzdFile = lmc1_LoadEzdFile("c:\temp\test.ezd");
if (intlmc1_LoadEzdFile > 0)
{
return;
}
int intlmc1_Mark = lmc1_Mark(true);
if (intlmc1_Mark > 0)
{
return;
}
int intlmc1_Close = lmc1_Close();
if (intlmc1_Close > 0)
{
return;
}
FreeLibrary(hEzdDLL);
}
}
}
Stellen Sie sicher, wenn Sie installiert haben die richtige c++ redistributable!
Ich hatte schon gepostet, die richtige Antwort unten.
InformationsquelleAutor bkjames | 2013-03-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die korrekte syntax lautet wie folgt.
Das ist der ganze code. Es ist grundsätzlich ein Delegierter zu der von nicht verwaltetem code. Die angehängte Attribut deklariert, das den Namen von der nicht verwalteten dll dann den EntryPoint ist der name der Methode, in der nicht verwalteten dll. Die Signatur Ihrer Stellvertretung, muss die Signatur der Methode, in der nicht verwalteten dll.
ok danke! Was ist die definition von Initialize-Methode in c++. So etwas wie lmc1_Initial2 Initialize(char* PathName, char* TestMode); ?
Nein, es ist lmc1_Initial2(char* anyname", "bool" anyboolname)
Was ist, wenn Sie den Namen kennen, aber nicht den Verzeichnispfad der DLL Laufzeit bis? Ich habe mit einem DLLImport aus kernel32.dll LoadLibrary, nach denen ein DLLImport Sie den Namen angeben, verwendet der geladenen DLL, aber gibt es eine Möglichkeit, das zu tun, ohne einen Aufruf der Win32-API?. Ich schaute auf die Reflection-namespace, aber mein Eindruck ist, dass es agieren will auf Assemblys, DLLs nicht.
InformationsquelleAutor bkjames
Verwenden Sie P-Invoke-Aufruf native DLL. Haben Sie vielleicht eine marshall einige datatype, um es zu schaffen.
http://msdn.microsoft.com/en-us/library/aa288468.aspx
InformationsquelleAutor MLeblanc