2012-04-05 23 views
-1

finden Sie in den folgenden BeispieleAnruf C++ DLL in .net C# DllImport

void ExitLibrary(); // C++ function 

Ich bin in der Lage, wie in C# verdeckte unter

[DllImport("VisualFOD.dll", CharSet = CharSet.Ansi)] 
public static extern void ExitLibrary(); 

dieser Methode wird die Live-Capturing zu starten verwendet werden

bool StartLive(DShowLib::Grabber* f_Grabber, HDC f_hHdc, RECT f_WindowRect); 

Diese Methode wird die Live-Erfassung

starten verwendet werden
[DllImport("TIS_UDSHL09_vc71.dll", CharSet = CharSet.Ansi)] 
public static extern bool StartLive(IntPtr f_Grabber, IntPtr f_hHdc, Rectangle f_WindowRect); 

Ich kann nicht auf die tatsächliche Klasse DShowLib :: Grabber zugreifen, wie in der 2. Anweisung C++ - Funktion erwähnt.

Haben Sie eine Idee, wie Sie den Klassennamen der Bibliothek deklarieren und erhalten?

Diese DLL ist keine COM/.Net-DLL, die als Referenz für C# -Umgebung verwendet werden soll.

+0

Ich denke, das ist das, was Sie suchen: http: // Stackoverflow.com/questions/4741035/how-do-i-dllexport-a-c-klasse-fuer-verwenden-in-a-cis-applikation – Kiril

+0

Dies wird nicht zu einem guten Ende kommen. Sie können mit DirectShow mit dem DirectShow.NET-Wrapper basteln. Geben Sie in einer Google-Abfrage den zweiten Treffer ein. –

Antwort

2

Wenn ich Ihre Frage richtig verstanden habe, können Sie nicht direkt auf die DShowLib :: Grabber-Klasse in C# zugreifen, wenn sie sich in der DLL befindet (und auf eine C++ - Headerdatei zugegriffen wird).

Zwei Lösungen sind verfügbar. Erstens können Sie die native DLL-Klasse in die C++/CLI-Klasse umbrechen, sodass Sie die systemeigenen C++ - Headerdateien einbeziehen können. Zweitens können Sie Ihre eigene DLL schreiben, wo Sie die DLL-Klasse reduzieren und P/Invoice Ihre Flatten-Methoden aufrufen können.

durch Abflachen ich meine:

class C 
{ 
    void M(int i, float j); 
} 

Das Verfahren M wie genannt werden muss:

__declspec(dllexport) BOOL __stdcall C_M(C * instance, int i, float j) 
{ 
    if (instance == nullptr) 
     return FALSE; 

    instance->M(i, j); 

    return TRUE; 
} 

aber bitte für Ihre Frage in Betracht Kommentare nehmen. Wenn Sie vorgefertigte Wrapper für die Bibliothek verwenden können, die Sie interessiert, sollten Sie dies tun :)

+0

Vielen Dank für die Informationen. Ich werde es versuchen und Sie weiter aktualisieren. – user1315385

0

Es gab viele Versuche, C#/C++ - Interop einfacher zu machen, aber bei weitem verwaltet C++ von Microsoft ist wahrscheinlich der beste (obwohl es ist nicht Teil des C++ - Standards).

Eine weitere vielversprechende Option ist CXXI ​​von Mono,

http://tirania.org/blog/archive/2011/Dec-19.html

, die einen standardkonformen Ansatz bietet.

Es braucht noch etwas Hacking (Google Summer of Code 2012 vielleicht), aber es sollte endlich Visual C++ und Windows unterstützen.