Я должен обернуть 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, могут быть вещи, которые я делал, которые были абсолютно глупыми, пожалуйста, укажите на это.Но я просто не могу понять, почему обычные методы могут быть открыты без проблем, но я не понимаю, почему геттеры получают ошибки компоновщика.Почему появляются ошибки компоновщика и как от них избавиться?