Ошибка компоновщика при переносе методов получения в C ++ / CLI - PullRequest
0 голосов
/ 25 апреля 2019

Я должен обернуть DLL C ++ (которую я не могу изменить) в C ++ / CLI, чтобы методы и классы, предоставляемые этим C ++, могли использоваться в C #.Моя проблема не в части C #, а в ошибках, когда я пытался обернуть код c ++ с помощью C ++ / CLI.

Вот странность проблемы, я могу обернуть конструкторы и другие методы, но я не могу обернуть геттеры, потому что это будет иметь ошибки компоновщика 2028 и 2019 (неразрешенный токен и внешний символ).Код выглядит следующим образом

Native.h

#pragma once
#ifdef NATIVE_EXPORTS
#define NATIVE_API __declspec(dllexport)
#else
#define NATIVE_API __declspec(dllimport)
#endif

class NATIVE_API SomeClass
{
        //some irrelevant fields


        //what I cannot wrap
    LONG height = 0;
    LONG width = 0;
    WORD count= 0;


public:

    __declspec(property(get = getHeight)) LONG height;
    __declspec(property(get = getWidth)) LONG width;
    __declspec(property(get = getCount)) WORD count;

    LONG getHeight() {
        return height;
    };
    LONG getWidth() {
        return width;
    };
    WORD getCount() {
        return count;
    };

    SomeClass(BYTE *ptr);
    BYTE* SomeMethod1(bool someCondition);
    BYTE* SomeMethod2(DWORD X, DWORD Y, DWORD panel_W, DWORD panel_H);
    ~SomeClass();
};

Wrapper.h

#pragma once
#include "windows.h"
#include "../NativeProject/Native.h"
using namespace System;
namespace Wrapper {
    public ref class ManagedClass
    {
    public:
        //no problem with the first four!!!!
        ManagedClass() (BYTE* ptr); //implemented in cpp
        ~ManagedClass() { delete _foo; };
        IntPtr ManagedMethod1(bool someCondition) { return IntPtr(_foo->SomeMethod1(someCondition)); };
        IntPtr ManagedMethod2(DWORD X, DWORD Y, DWORD panel_W, DWORD panel_H) { return IntPtr(_foo->SomeMethod2(X,Y,panel_W,panel_H)); };
        LONG getHeight() { return _foo->getHeight(); }; //linker error!!!
        LONG getWidth() { return _foo->getWidth(); }; //linker error!!!
        WORD getCount() { return _foo->getCount(); }; //linker error!!!
    protected:

        !ManagedClass() { delete _foo; };
    private:
        SomeClass *_foo;
    };
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...