【问题标题】:c++ cli wrapper design issuec++ cli wrapper设计问题
【发布时间】:2014-02-25 15:31:02
【问题描述】:

我正在为非托管 mfc dll 编写 c++ cli 包装器。我现在的设计是这样的。

假设我有一个要包装的非托管结构,如下所示:

struct
{
    int firstValue;
    int secondValue;
}somestruct;

我现在这样做的方法是首先创建一个标头,为我的结构声明 setter 和 getter:

class somestructWrapper
{
    void* SomeStruct;

    int GetFirstValue();
    void SetFirstValue(int n);
    int GetSecondValue();
    void SetSecondValue(int n);
};

此标头不知道结构,它只是为它保留一个在 cpp 中分配的 void*。

然后我将创建一个 cpp 文件,其中包含结构体 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 然后在托管类中为每个属性创建一个属性非常耗时。

有没有更干净的方法来完成这个?

【问题讨论】:

  • 您不必为了在 CLR 中再次包装它而将结构包装在本机类中。当您尝试直接包含 dll 标头时,编译错误是什么?尝试仅将其包含在 CLI 包装器的实现文件中,而不是包含在其头文件中(在此处前向声明)
  • 你可能不需要那个包装器。
  • 如果可以的话,我会建议清理头文件(windows.h 听起来很麻烦,但它通常是重要的包含的 order)。其他替代方法是在 CLR 文件中复制本机 C++ 包装文件的编译选项。还要检查您的预编译头文件。我通常为本地编译单元和 CLI 编译单元提供单独的预编译头文件。
  • 保存结构的文件的预编译头。只需创建一个新的 CLR 类,从其头文件和实现文件中删除 everything,然后包含您的本机 dll 头文件。这样您就可以隔离 CLR 编译单元中的本机头文件问题。
  • 您必须为包含它的 .cpp 文件启用它,因为没有编译头文件。所以你必须在编译选项中启用它。或者在实现public ref class SomeStruct 的文件中获取您现在拥有的内容,从中删除所有内容,然后包含标题。 VS 可能会抱怨缺少预编译的标头。在测试期间将其关闭(也在特定文件的编译器选项中),因为您在尝试清理 dll 标头时不希望 CLI 预编译标头。也许它会在没有它的情况下编译 - 你知道问题出在哪里。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2014-03-21
    • 2011-07-04
    相关资源
    最近更新 更多