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.

  1. Aufruf von Windows-API-Funktion LoadLibrary() laden der DLL dynamisch;

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

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

  1. Wählen Sie "Microsoft Visual C++ 6.0", wenn die Installation von visual studio, und klicken Sie auf "Option Ändern".
  2. Wählen Sie "VC++ - MFC-und Template-Bibliotheken" und klicken Sie auf "Option Ändern".
  3. Wählen Sie "Microsoft Foundation Class Libraries" und klicken Sie auf "option ändern".
  4. Wählen Sie die Optionen, wie Folgendes Bild, und klicken Sie auf "OK".
  5. Ö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"
  6. Wählen Sie "Link", wählen Sie "Output" in der Kategorie, und fügen Sie "wWinMainCRTStartup" in "Entry-point" - symbol"
  7. "Alle ändern "char" zu "TCHAR" im source-code.
  8. Alle ändern, Zeichenkette enthalten, die durch doppelte Anführungszeichen "..." , _T("...")
  9. 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);
        }
    }
}
Sie könnte verwenden die explizite Verknüpfung mit C++/CLI, um Ihre wrapper. Möglich, Duplikat der stackoverflow.com/questions/15672351/...
Stellen Sie sicher, wenn Sie installiert haben die richtige c++ redistributable!
Ich hatte schon gepostet, die richtige Antwort unten.

InformationsquelleAutor bkjames | 2013-03-29

Schreibe einen Kommentar