C++ 在Windows窗体应用程序中使用boost序列化

C++ 在Windows窗体应用程序中使用boost序列化,c++,winforms,boost,clr,C++,Winforms,Boost,Clr,我对boost和.net框架有一个问题。我写的课没有.net。这个项目工作得很好,现在我将类文件包含到windows窗体应用程序中。出现了许多编译器错误,例如singleton.hpp(boost库)中的“u declspec(dllexport)无法与/clr:pure或/clr:safe一起使用”。我创建了一个示例。 在Form1标头中,仅包含该类,不执行任何其他操作,仅从VisualStudio2010生成的代码执行 这是一个测试类,我创建它是为了向您展示一个简单的案例: #ifndef

我对boost和.net框架有一个问题。我写的课没有.net。这个项目工作得很好,现在我将类文件包含到windows窗体应用程序中。出现了许多编译器错误,例如singleton.hpp(boost库)中的“u declspec(dllexport)无法与/clr:pure或/clr:safe一起使用”。我创建了一个示例。 在Form1标头中,仅包含该类,不执行任何其他操作,仅从VisualStudio2010生成的代码执行

这是一个测试类,我创建它是为了向您展示一个简单的案例:

#ifndef FOO_H
#define FOO_H

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>

class Foo
{
private:
    int  name;

public:
    void setName(int name);
    int getName(void);
private:
    friend boost::serialization::access;
    template<class Archive>
    void serialize (Archive& arch, const unsigned int)
    {
        arch & BOOST_SERIALIZATION_NVP(this->name);
    }
};
#endif
\ifndef FOO\H
#定义FOO_H
#包括
#包括
福班
{
私人:
int名称;
公众:
void setName(int name);
int getName(void);
私人:
friend boost::serialization::access;
模板
void序列化(存档和arch,常量unsigned int)
{
arch&BOOST\u序列化\u NVP(此->名称);
}
};
#恩迪夫
我尝试将/clr:pure切换到/clr,编译器可以用它编译它,但是在启动程序时发生了一个错误。它是一个在exe文件中标题为“调试断言失败!”的文件。在消息框中,您还可以阅读“表达式:_CrtIsValidHeapPointer(pUserData)” 目前我使用的是Boost1.52.0,但我也使用了Boost1.53.0。我用“bootstrap.bat”和“bjam.exe”安装了boost


有人知道这个问题的解决方案吗

好了,汉斯·帕桑找到了解决办法。我为一些有同样问题但不知道如何更改/clr的人发布了此方法。必须将/clr:pure更改为/clr。发生的错误只是暂时的。现在它起作用了


要在VisualStudio(2010/2012)中使用/clr:pure,必须输入“项目”选项卡并单击“属性”。在这里单击C/C++>>General,并将“公共语言运行时支持”从/clr:pure转到/clr

您必须使用/clr,不能使用纯文本。谁也猜不出“发生了一个错误”是什么意思。@Hans Passant哦,对不起,我以为这不重要。exe文件中出现“调试断言失败!”。在消息框中,您还可以阅读“Expression:_CrtIsValidHeapPointer(pUserData)”,注意
BOOST\u SERIALIZATION\u NVP
根据其参数生成元素名称,因此名称将为“this->name”。我不确定xml解析器是否适合使用“->”。请改用
BOOST\u SERIALIZATION\u NVP(name)
,或者如果它应该是完全限定的,请使用临时本地变量。@IgorR感谢您提供了这些信息,但这只是一个简单的示例项目。在实际项目中,我没有使用这个,但我尝试了一下。回到问题上来。调试错误只是暂时的,现在没有发生。因此,使用/clr似乎可以解决这个问题。