c ++ cli包装设计问题

时间:2014-02-25 15:31:02

标签: design-patterns struct c++-cli

我正在为非托管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然后在托管类中为每个属性创建一个属性。

有没有更简洁的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

我们将问题或至少是第一层的问题追溯到somestruct标头中包含的重新编译的标头。这会引入各种Windows标头并搞乱CLR编译。这样大而普及的标题只应包含在.cpp文件中,而其他编译单元要定义自己的标题(或者如果它们使用相同的预编译标题,则应该再次包含在.cpp文件中)