如何在.NET C ++ CLI GUI应用程序中使用Boost类

时间:2014-11-21 22:38:09

标签: .net boost c++-cli

我正在使用C ++ CLI在Visual Studio 2012中编写Windows窗体GUI应用程序,我真的需要使用Boost双向映射来协调某些GUI元素值与某些内部结构中的值。我下载并解压缩了boost包,然后在我的项目的Properties菜单中,我将Boost位置添加到Configuration Properties - > VC ++目录 - >包括目录。

但是,当我添加boost include时(没有别的,甚至没有声明一个boost :: bimap对象)

#include <boost/bimap.hpp>

我收到了错误

error C3389: __declspec(dllexport) cannot be used with /clr:pure or /clr:safe
error C3395: 'boost::serialization::void_cast_register' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention

当我遵循编译错误时,我最终进入&#34; void_cast_fwd.hpp&#34;并在下面包含&#34; BOOST_DLLEXPORT&#34;但我不知道该怎么做。

#ifndef  BOOST_SERIALIZATION_VOID_CAST_FWD_HPP
#define BOOST_SERIALIZATION_VOID_CAST_FWD_HPP

// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif

/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// void_cast_fwd.hpp:   interface for run-time casting of void pointers.

// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com . 
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// gennadiy.rozental@tfn.com

//  See http://www.boost.org for updates, documentation, and revision history.

#include <cstddef> // NULL
#include <boost/serialization/force_include.hpp>

namespace boost {
namespace serialization {
namespace void_cast_detail{
class void_caster;
} // namespace void_cast_detail
template<class Derived, class Base>
BOOST_DLLEXPORT 
inline const void_cast_detail::void_caster & void_cast_register(
    const Derived * dnull = NULL, 
    const Base * bnull = NULL
) BOOST_USED;
} // namespace serialization
} // namespace boost

#endif // BOOST_SERIALIZATION_VOID_CAST_HPP

我是.NET和C ++ CLI的新手,不知道如何更改编译器命令/ clr:pure或/ clr:safe。

关于如何在我的应用程序中使用此boost库的任何想法都将非常感激。

另外,我现在不担心可移植性,我关心的是它在Windows上编译。我假设我在.NET中使用C ++ CLI比尝试使用boost库更具有可移植性限制,但我也有兴趣听到有关这方面的意见。

谢谢!

2 个答案:

答案 0 :(得分:4)

C ++ / CLI编译器通常可以确定代码是本机代码还是托管代码。但并非总是如此,而且这有助于产生您看到的错误。您需要帮助并明确说明哪些声明是原生的。

首先确保正确设置了/ clr选项,对于您尝试使用的增强代码没有任何安全或纯粹。项目+属性,常规,公共语言运行时支持设置。确保它是普通的/ clr。

然后告诉编译器boost头包含带有#pragma:

的本机代码
#pragma managed(push, off)
#include #include <boost/bimap.hpp>
#pragma managed(pop)

应该处理编译错误。

答案 1 :(得分:0)

编译器消息很明确:您无法从CLR(或混合模式)程序集导出本机DLL条目。

因此,指定__delcspec(dllexport)的代码是非法的。

Boost序列化 - 可能 - 有助于添加这些可导出的内容,以便您可以在一个DLL中定义可序列化的类,并从另一个模块中反序列化它们(基于运行时类型信息)。

然而,这不是您目前所需要的。

做什么?

您需要在代码中找到具有违规声明说明符的位置,并确保它不再是顽皮的。

我非常有信心这个特定的声明规范不是硬编码的,但很可能由像

这样的开关控制
#define BOOST_SERIALIZATION_WHELPS_IM_NOT_INTERESTED_IN_WIN32_DLL_STUFF_HERE