【发布时间】: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