none
Wrapper Klasse für nicht Verwalteten Code RRS feed

  • 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

     

     

    Donnerstag, 21. Juli 2011 14:59

Antworten

  • Dann schau Dir das mal an:
    http://www.codeproject.com/KB/mcpp/ManagedWrapperSample.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert Palin Freitag, 5. August 2011 12:46
    Samstag, 23. Juli 2011 11:23
    Moderator
  • 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
    Mittwoch, 3. August 2011 06:33
    Moderator

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
    Freitag, 22. Juli 2011 06:59
    Moderator
  • 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.

     

    Freitag, 22. Juli 2011 07:23
  • Dann ist es managed code. Dann verstehe ich nicht ganz, was Du hier mit einem Wrapper willst?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 22. Juli 2011 09:22
    Moderator
  • 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.

     

    Wie mach ich das ?

     

    Freitag, 22. Juli 2011 09:54
  • Ich habe immer noch nicht verstanden was Du kapseln willst.

    Hast Du nun eine native Klasse und Du willst einen managed Wrapper?
    Oder hast Du eine managed Klasse und willst einen nativen Wrapper?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 22. Juli 2011 11:04
    Moderator
  • Ich hab eine native Klasse und möchte einen managed Wrapper.

     

    Danke schon mal für deine Mühe.
    Freitag, 22. Juli 2011 11:14
  • Dann schau Dir das mal an:
    http://www.codeproject.com/KB/mcpp/ManagedWrapperSample.aspx


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    • Als Antwort markiert Palin Freitag, 5. August 2011 12:46
    Samstag, 23. Juli 2011 11:23
    Moderator
  • 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.

     

    Wenn ich nun Probiere die Variable zu Inztanzieren (mobjResultSet = new CacheObject::ResultSet();), bekomme ich den Fehler das keine geeigneter Standardkonstruktor vorhanden ist.
    Montag, 25. Juli 2011 07:56
  • 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
    Mittwoch, 3. August 2011 06:33
    Moderator
  • Danke für die Hilfe.

     

    Jetzt muss ich mal schauen ob ich den Header noch irgendwo her bekomme.

    Freitag, 5. August 2011 12:47