我正在为非托管mfc dll编写c ++ cli包装器。我目前的设计看起来像这样。
假设我有一个非托管结构我想要包装,如下所示:
struct
{
int firstValue;
int secondValue;
}somestruct;
我现在的做法是先创建一个标头,为我的struct声明setter和getter:
class somestructWrapper
{
void* SomeStruct;
int GetFirstValue();
void SetFirstValue(int n);
int GetSecondValue();
void SetSecondValue(int n);
};
这个头文件不知道它只保留了一个void *,它在cpp中分配了它。
然后我将创建一个cpp文件,其中包含struct somestruct并实现getter / setter。
执行此操作后,我创建一个启用了/ clr的c ++文件,该文件包含somestructWrapper并允许我从托管代码访问这些函数。
public ref class SomeStruct
{
SomeStructWrapper* someStructWrapper
property int FirstValue
{
int get()
{
return someStructWrapper->GetFirstValue();
}
set(int n)
{
someStructWrapper->SetFirstValue(n);
}
}
..............
}
我首先尝试在启用了/ clr的类中直接执行此操作,但是只要我从dll中包含一个文件就不会编译(这就是我有somestructWrapper类为我提供干净的标头的原因)
我有50-100个属性的结构,并且首先编写setter / getter然后在托管类中为每个属性创建一个属性。
有没有更简洁的方法来实现这一目标?
答案 0 :(得分:1)
我们将问题或至少是第一层的问题追溯到somestruct
标头中包含的重新编译的标头。这会引入各种Windows标头并搞乱CLR编译。这样大而普及的标题只应包含在.cpp文件中,而其他编译单元要定义自己的标题(或者如果它们使用相同的预编译标题,则应该再次包含在.cpp文件中)