2012-03-30 10 views
3

Wir haben ein großes C++ - Projekt, das als nativen nicht verwalteten Code kompiliert wird. Wir müssen eine Funktion aus verwaltetem Code verwenden, aber wir wollen nicht das gesamte Projekt in/clr kompilieren.Wrapping verwalteten Code für die nicht verwaltete Verwendung

Also habe ich eine DLL, eine Ref-Klasse namens B, die in der exportierten nativen Klasse A ausgesetzt ist Problem ist ein C1190: verwaltete Zielcode erfordert eine '/ clr' -Option wegen der vcclr.h enthalten .

Ich würde gerne wissen, ob es eine Möglichkeit gibt, eine Art Schnittstelle zu erstellen, die Code in nicht verwalteten Methoden verwaltet.

Hier ist mein Code:

#pragma once 
#include "EX_Port.h" 
#include <vcclr.h> 

ref class B; 

class EX_API A 
{ 
    public: 
     A();   
     int DeviceCount(); 

    private: 
     gcroot<B^> _device; 
}; 

Ich konnte es innerhalb der CPP durch gcnew die B-Klasse zu arbeiten. Aber dann habe ich ein lokales Objekt, während ich es im globalen Rahmen haben möchte. Ich habe gerade angefangen, CLI-Programmierung zu machen, so dass mir einige Praktiken nicht bewusst sind.

Dank

+0

Machen Sie C++/CLI-Bibliothek mit nicht verwalteten Schnittstelle für verwaltete Klassen –

Antwort

6

Ihr großes C++ Programm wird die CLR hat zu laden und zu initialisieren, bevor es irgendein verwalteten Code ausführen kann. Es gibt mehr Möglichkeiten, dies zu tun, rangierten von flexibelsten zu vergessen:

  • Sie den CLR-Hosting-Schnittstelle verwenden kann, um explizit die CLR zu laden und beliebig verwalteten Code auszuführen. Grundlegende Starter für das ist diese MSDN page und die vielen Beispiele, die Sie auf Websites wie CodeProject finden können.

  • Sie können Ihre verwalteten Klassen [ComVisible] machen. Ihr C++ - Code kann dann Standard-COM-Programmiertechniken verwenden, um eine Instanz der verwalteten Klasse zu erstellen und ihre Methoden aufzurufen (CoInitializeEx und CoCreateInstance, die # Import-Anweisung). Die COM-Installation stellt sicher, dass die CLR automatisch geladen wird und die richtige Assembly lädt. Für die Verwaltung der CLR ist kein zusätzlicher Code erforderlich. Berücksichtigen Sie diese Option, wenn Sie bereits über eine Investition in COM verfügen, andernfalls sollten Sie etwas berücksichtigen, wenn Sie keine COM-Kenntnisse haben.

  • Die beiden oben genannten Techniken ermöglichen die Ausführung beliebigen verwalteten Codes, nicht nur von C++/CLI-Code. Spezifisch für C++/CLI können Sie eine freie Funktion schreiben und das Attribut __declspec (dllexport) darauf anwenden. Der Compiler generiert einen Stub, der die Funktion exportiert, so dass Sie sie aus Ihrem C++ - Code mit LoadLibrary + GetProcAddress aufrufen können. Der Stub lädt automatisch die CLR. Dies ist sehr einfach, aber es ist ziemlich unflexibel, da Sie nur eine einfache Funktion und nicht eine Klasse offen legen.

Verwandte Themen