Managed C++/CLI Bibliothek



  • Hi,

    ich möchte eine o.g. Bibliothek erstellen und diese dann in in einer C++/CLI Anwendung benutzen.

    Dafür habe ich in VS2005 eine neue Solution erstellt mit 2 Projekten, ManagedLib und ManagedTest. ManagedLib ist eine CLR Class Library und ManagedTest eine CLR Console Application.

    In ManagedLib habe ich folgende Klasse eingefügt:

    Vector3.h

    #pragma once
    
    ref class CVector3
    {
    public:
    	CVector3(void);
    	void print();
    };
    

    Vector3.cpp

    #include "StdAfx.h"
    #include "Vector3.h"
    
    CVector3::CVector3(void)
    {
    }
    
    void CVector3::print()
    {
    	System::Console::WriteLine("vector print method");
    }
    

    Für ManagedTest habe ich eine Referenz zum Projekt ManagedLib angelegt und unter Projekteinstellungen als zusaätzliches Include-Dir. das Verzeichnis von ManagedLib hinzugefügt. Außerdem den Entry-Point auf Main gesetzt.

    ManagedTester.h

    #pragma once
    
    ref class ManagedTester
    {
    public:
    	ManagedTester(void);
    };
    

    ManagedTester.cpp

    #include "ManagedTester.h"
    #include "Vector3.h"           //<-- FEHLER LNK2020
    
    ManagedTester::ManagedTester(void)
    {
    	CVector3^ vect;
    }
    
    void Main()
    {
    	gcnew ManagedTester();
    }
    

    Das ganze wird auch erfolgreich kompiliert, aber beim Linken bekomme ich die Ausgabe:

    1>Linking...
    1>ManagedTester.obj : error LNK2020: unresolved token (06000002) CVector3::.ctor
    1>ManagedTester.obj : error LNK2020: unresolved token (06000003) CVector3::print
    1>F:\Support Projects\ManagedLib\Debug\ManagedTest.exe : fatal error LNK1120: 2 unresolved externals

    Irgendwie werden die Definitionen des Vektor Konstruktors und der Print Methode nicht gefunden, wenn ich diese direkt in Vector3.h schreibe geht das Linken.
    Außerdem läuft alles problemlos, wenn CVector3 eine unmanaged Klasse (ohne ref) ist.

    Weiss hier wer weiter? Hab schon alles mögliche versucht 😡
    Wenn es hilft könnte ich auch die Solution als zip hochladen.

    Gruß, Ligh7ning



  • Du darfst die Assembly *nicht* via Include einbinden!!! Sondern *nur* den Assembly-verweis in Deinem projekt aufnehmen!
    Dazu muss die Klasse CVector3 in Deiner Assembly aber natürlich als "public" deklariert werden!



  • Ahh, danke Dir!

    Was für ein blöder Fehler, hatte ich vorher auch schon probiert aber ich dachte dass die Klasse implizit als public deklariert wird... 😕

    Da hab ich gleich noch ne Frage: Wenn ich eine statische .lib anstatt einer dll erstelle, muss ich die dann beim Benutzen in einem anderen Projekt normal linken und die includes setzen? Weil es ja keine Assembly Reference ist?



  • Bei einer LIB kannst Du logischerweise keine Assembly-Referenz irgendwo hinzufügen, somit brauchst Du dann die H-Files.

    Ich persönlich würde aber bei .NET-Projekten auf *keinen Fall* mit LIBs arbeiten! Das führt nur zu Problemen und unnötigen Schwierigkeiten.



  • OK, danke dann fange ich mal an meine DLL zu schreiben 🙂


Anmelden zum Antworten