Как экспортировать несколько классов с помощью библиотеки оболочки C ++ / CLI для собственной библиотеки C ++ - PullRequest
2 голосов
/ 03 августа 2011

У меня есть собственная библиотека C ++ (назовем ее CoreLib.dll), и она предоставляет два класса:

  • Core.h
  • Atom.h

У меня есть оболочка CLI / C ++ (назовем ее CoreWrapper.dll), которая позволяет проектам .NET создавать объекты Core и Atom:

  • CoreDotNet.h
  • AtomDotNet.h (включая Atom.h и CoreDotNet.h)

Когда я компилирую CoreWrapper, компилируется только CoreDotNet.h, а AtomDotNet.h игнорируется. Если я хочу скомпилировать AtomDotNet.h, тогда я должен включить его в CoreDotNet.h, но это вызывает ошибку компилятора в CoreDotNet.h:

error C2011: 'CoreWrapperNS::CoreDotNet' : 'class' type redefinition

Вот некоторый основной код, который представляет то, что я делаю:

#pragma once // <-- should protect from class type redefinition
#include "Core.h"
//#include "AtomDotNet.h" // uncommenting causes compiler error C2011

using namespace CoreNS;

namespace CoreWrapperNS
{
    public ref class CoreDotNet
    {
    public:
        // Allows users to instantiate a core object
        CoreDotNet();
        CoreDotnet(Core* core);
        //... destructor follows
    };
}

Вот файл AtomDotNet.h:

#pragma once // <-- should protect from class type redefinition
#include "Atom.h"
#include "CoreDotNet.h"

namespace CoreWrapperNS
{
    public ref class AtomDotNet
    {
    private:
        Atom*       _atom;
        CoreDotNet^ _core;
    public:
        AtomDotNet()
        {
            // The atom allows users to instantiate an atom with a core
            // and to get a reference to the core of the given atom.
            Core* core = new Core();
            _atom = new Atom(core);
            _core = gcnew CoreDotNet(core);
        }

        inline CoreDotNet^ GetCore(){return _core;}
        //... destructor follows
    };
}

Проект CoreWrapper содержит ссылку на проект CoreLib. Я видел некоторые посты вокруг "Internets" о том, что оболочки CLI / C ++ получают вышеупомянутую ошибку компилятора, потому что они ссылаются на проект C ++ И включают файл заголовка, но у меня не было этой проблемы, пока я не добавил второй класс т. е. класс AtomDotNet) к библиотеке-обертке, и я попытался скомпилировать его. Есть идеи о том, что здесь может происходить?

Ответы [ 3 ]

3 голосов
/ 03 августа 2011

Простое написание кода в заголовочных файлах не приводит к его включению в проект.

Вам необходимо добавить в проект файлы .cpp и #include заголовки.

1 голос
/ 02 февраля 2012

C ++ / CLI НЕ требует заголовков, фактически одно из преимуществ, которые объявляет C ++ / CLI, состоит в том, что он устраняет заголовки и использует отражение для получения необходимой информации, которая обычно включается в заголовок. Переименуйте ваш .h в .cpp и забудьте о .h кроме как в собственном коде.

Чтобы использовать управляемые классы, определенные в другом файле .CPP в том же проекте, используйте '#using' (аналогично #include) для файла obj в CoreDotNet.cpp следующим образом:

#using "AtomDotNet.obj"

Кроме того, на странице свойств CoreDotNet.cpp или в свойствах вашего проекта в разделе C / C ++ в ссылке Resolve #using добавьте путь «$ (IntDir)», чтобы он мог найти файл при компиляции.

Это путь C ++ / CLI, больше нет ада DLL и больше нет .h ада!

0 голосов
/ 03 августа 2011

C ++ / CLI не имеет концепции заголовочных файлов. Объявление в заголовочном файле является его реализацией. Таким образом, включение "CoreDotNet.h" в "AtomDotNet.h" является проблемой.

Если у вас есть CoreDotNet.cpp, который просто содержит:

#include "CoreDotNet.h"

и аналогичный шаблон для «AtomDotNet.h», затем удалите включение «CoreDotNet.h» из «AtomDotNet.h», чтобы его можно было скомпилировать.

Вам нужно относиться к C ++ / CLI так же, как к проекту C # и связанным классам / *. Cs файлам.

...