2010-12-28 8 views
2

Ich habe ein Erbe verwalteten C++ dll bekam, und ich brauche eine Funktion aufrufen, die einen verwalteten Typ zurückkehrt.Exportfunktion mit clr Parameter aus dll?

Für dllexports ohne verwaltete Typen, das ist einfach, definiere ich nur meine statische c (++) Funktion in einem Header wie folgt aus:

extern "C" 
{ 
    __declspec(dllexport) int __cdecl InitSystem(); 
} 

Aber jetzt ist die statische c (++) Funktion sollte zurückkehren ein verwalteter Typ, und hier habe ich ein Problem. Wenn ich (zum Beispiel) versuchen:

extern "C" 
{ 
    __declspec(dllexport) System::Collections::Generic::List<System::String^>^ __cdecl InitSystem(); 
} 

ich einen Compiler-Fehler (Funktionsdefinition Bedürfnisse __clrcall Signatur).

Da die DLL nicht eine Baugruppe (glaube ich), ich ist ein bisschen mit einem Verlust, wie ein einfachen Funktionsaufruf exportieren .net/clr Parameter angeben kann. Das ist wahrscheinlich einfach und ich schaue nur in die falsche Richtung.

Antwort

2

Es hat eine Versammlung sein, gibt es keinen anderen Weg, um Code mit einem verwalteten Typ, so zu bauen. Das Mischen von verwaltetem und nativem Code in einer Assembly ist in Ordnung. Das Problem wird automatisch gelöst, die Funktion wird in den Metadaten verfügbar sein und muss nicht exportiert werden. Sie müssen die gesamte Dekoration fallen lassen, sie kann nicht auf eine verwaltete Methode angewendet werden. Und es sollte in einer ref-Klasse sein, damit andere verwaltete Sprachen es verwenden können.

public ref class Mumble { 
public: 
    static System::Collections::Generic::List<System::String^>^ InitSystem(); 
}; 

Ein C# -Programm kann jetzt var lst = Mumble.InitSystem() verwenden. Es wird empfohlen, einen Namespace zu verwenden.

beobachten btw für/clr aus, es wird leicht umwandeln nativen Code zu IL ohne Beanstandung. Entweder deaktivieren Sie/clr in einer Quellcodedatei oder verwenden Sie #pragma managed.