我必须用C ++ / CLI包装一个C ++ dll(无法修改),以便此C ++公开的方法和类可以在C#中使用。我的问题与C#部分无关,但是当我尝试用C ++ / CLI包装C ++代码时出现错误。
这是问题的怪异之处,我能够包装构造函数和其他方法,但是我无法包装吸气剂,因为它将出现链接器错误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的新手,所以我所做的某些事情可能绝对是愚蠢的,请指出这些。但是我只是无法弄清楚为什么可以毫无问题地公开常规方法,但是我不明白为什么吸气剂会出现链接器错误。为什么出现链接器错误,我该如何解决?