Benutzer mit den meisten Antworten
Wrapper Klasse für nicht Verwalteten Code

Frage
-
Hallo Zusammen,
ich Probiere gerade eine Wrapper Klasse für nicht Verwalteten Code für unseren Datenbank zugriff zu schreiben, damit diese schneller werden.
Mein Problem ist, dass ich eigentlich nur in VB.NET Programmier und überhaupt keine Ahnung von C++/CLI habe.
Mit Hilfe von google und viel und ausprobieren habe ich folgenden Quellcode zusammen bekommen:
// CacheInterface_C++.h #pragma once #pragma comment(lib,"CacheObject.lib") #using <mscorlib.dll> #include <windows.h> #import "CacheObject.dll" using namespace System; using namespace System::Runtime::InteropServices; namespace CacheInterface_C { public ref class ResultSet { private: CacheObject::ResultSet *mobjResultSet; //1 public: ResultSet(){ mobjResultSet = new CacheObject::ResultSet(); //2 } ~ResultSet(){ delete mobjResultSet; //3 } }; }
Die meines Erachtens wichtigen Befehle/Zuweisungen habe ich einfach mal direkt nach ihnen mit 1, 2 und 3 Kommentiert.
Wenn ich alle 3 Auskommentiere, kann ich die Klasse ohne Probleme Kompilieren.
Wenn ich 2 und 3 Auskommentiere, bekomme ich bei 1 bei CacheObject nach der :: Syntax die Member angezeigt.
Beim Kompilieren bekomme ich die Warnung:
„warning LNK4248: Nicht aufgelöstes Typeref-Token (0100000F) für "CacheObject.ResultSet". Das Abbild kann möglicherweise nicht ausgeführt werden.“
Wenn ich keine der Stellen Auskommentiere bekomme ich die Fehler das keine geeigneter Standardkonstruktor bzw. Destruktor vorhanden ist.
Die CacheObject.dll und .lib Dateien befinden sich beide im Projekt Verzeichnis und auch im Debug Ordner.
Eine Header Datei ist leider nicht vorhanden.
Wenn ich über das Studio einen Verweis zur CacheObject hinzufüge, wird mir Automatisch eine Interop erstell, die ich dann problemlos Verwenden kann. Was aber, wenn ich es richtig verstanden habe, ja nicht mein Ziel ist, sondern ich möchte in meiner Wrapper-Klasse direkt auf die nicht Verwalteten-Klasse zugreifen um eine bessere Performance zu bekommen.
Da ich keine Ahnung von C++ habe, ist mir Momentan nicht klar wo der Fehler liegen könnte und bei den Suchbegriffen unter dehnen ich gegoogelt habe, hab ich auch nichts gefunden mit dem ich was Anfangen kann.
Ich hoffe mal dass mir hier jemand weiter helfen kann.
MFG
Björn
Antworten
-
Bei mir scheint nur der zugriff auf die native Klasse nicht richtig zu Funktionieren.
Da ich keine Header-Datei habe, habe ich Probiert die Klasse mit den Befehlen,*#pragma comment(lib,"CacheObject.lib")*und *#import "CacheObject.dll"*einzubinden.
Dieses scheint nicht ganz zu klappen.Du kannst ohne Header Datei auf keine native Klasse zugreifen.
Punkt!C++ hat keine Reflection. Du benötigst eine C++ Klassen Deklaration!
Auch eine Lib nützt Dir gar nichts ohne Header oder definierte Interfaces oder Einsprungpunkte!
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Palin Freitag, 5. August 2011 12:45
Alle Antworten
-
mobjResultSet = new CacheObject::ResultSet(); //2
Gibt es denn diesen Namespace überhaupt und auch diese Klasse?
Da Du einen #import machst sieht das eher nach managed Klasse als nach nativer Klasse aus...Du müsstest bei einer nativen Klasse den Header importieren!
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Die Header Datei der Klasse hab ich leider nicht.
Auch werden beim deklarieren der Klasse (Bei 1), die Member angezeigt.
Ich hatte mir auch die .dll in einem anderen Projekt über Verweis Hinzufügen integriert.
Hier wird mir dann eine Interop erstellt, bei der ich auf die Member zugreifen kann.
-
Ich hab mich da, glaube ich Falsch ausgedrückt.
Das mit der Interop möchte ich nicht machen, sondern einen Wrapper schreiben, wegen der Besseren Performance.
Ich habe aber nur eine .dll- und eine .lib- Datei von der Klasse für die ich den Wapper schreiben möchte.
-
-
Danke für den Hinweiß, diesen oder ähnliche Artikel hatte ich auch schon gefunden und mit ihrer Hilfe den Quellcode oben produziert.
Bei mir scheint nur der zugriff auf die native Klasse nicht richtig zu Funktionieren.
Da ich keine Header-Datei habe, habe ich Probiert die Klasse mit den Befehlen, #pragma comment(lib,"CacheObject.lib")und #import "CacheObject.dll" einzubinden.
Dieses scheint nicht ganz zu klappen.
Bei der Deklaration meiner Variable mobjResultSet werden mir bei CacheObject:: die Member angezeigt.
-
Bei mir scheint nur der zugriff auf die native Klasse nicht richtig zu Funktionieren.
Da ich keine Header-Datei habe, habe ich Probiert die Klasse mit den Befehlen,*#pragma comment(lib,"CacheObject.lib")*und *#import "CacheObject.dll"*einzubinden.
Dieses scheint nicht ganz zu klappen.Du kannst ohne Header Datei auf keine native Klasse zugreifen.
Punkt!C++ hat keine Reflection. Du benötigst eine C++ Klassen Deklaration!
Auch eine Lib nützt Dir gar nichts ohne Header oder definierte Interfaces oder Einsprungpunkte!
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Palin Freitag, 5. August 2011 12:45