C++ cli 将BoostTest与C++/CLI:可能还是不可能?

C++ cli 将BoostTest与C++/CLI:可能还是不可能?,c++-cli,boost-test,C++ Cli,Boost Test,我有一个VisualStudio项目,其中包含程序(模型)的代码。我已经创建了另一个项目,将boost测试放在其中 问题是我不能让它工作 我可以在项目中单独使用boost测试,但只要我想链接(引用等)到第一个项目(我想运行测试的项目),boost测试项目就不会编译: 1>E:\boost_1_53_0\boost/detail/interlocked.hpp(99): warning C4164: '_InterlockedExchange' : fonction intrinsèque

我有一个VisualStudio项目,其中包含程序(模型)的代码。我已经创建了另一个项目,将boost测试放在其中

问题是我不能让它工作

我可以在项目中单独使用boost测试,但只要我想链接(引用等)到第一个项目(我想运行测试的项目),boost测试项目就不会编译:

1>E:\boost_1_53_0\boost/detail/interlocked.hpp(99): warning C4164: '_InterlockedExchange' : fonction intrinsèque non déclarée
1>E:\boost_1_53_0\boost/detail/interlocked.hpp(100): warning C4164: '_InterlockedExchangeAdd' : fonction intrinsèque non déclarée
1>E:\boost_1_53_0\boost/smart_ptr/detail/spinlock_w32.hpp(62): error C3861: '_InterlockedExchange' : identificateur introuvable
我读到你不能

<>你的代码不是C++,而是“C++ CLI”,因此不能使用Boost。C++没有系统命名空间。在每个.cpp文件中,您可以使用C++/CLI(因此也可以使用系统名称空间)或boost。如果您想使用系统名称空间,您必须启用“Common Langauge Runtime Support”,对于boost,您必须禁用它

>有人能确认Boost不可能与C++/CLI程序一起使用吗?是的,有可能

首先,必须将C++/CLI项目更改为/clr(/clr:pure或/clr:safe不起作用)。这允许您的项目以混合模式运行,即运行本机C++和托管代码。

为VisualStudio设置Boost.Test(将路径添加到Boost的.h中,并在链接器中添加.lib路径;您可能必须编译Boost,因为在某些情况下它不是“仅头文件”);这里有一个很好的教程

就这样,您可以编写和编译测试


但是,由于C++/CLI代码和Boost的编译(很可能是链接)过程中存在错误,我无法将Boost测试放在不同的项目中;因此,我不得不把单元测试放在程序本身的代码中(在分离的CPP文件中,虽然这是一个可接受的解决方案)。

< P>基本问题是,在C++(非CLI)代码中,如Boost,您不能持有任何托管引用或指针。p> 我发现,对于C++/CLI代码,通常最好使用C#测试框架。C语言可以与C++/CLI部分进行对话,可以与纯C++部分进行对话。此外,大多数C++用例都是用C或C++编写.NET的用例,所以测试.NET可以看到的接口是一个自然的选择。 例如,我有一个项目,其中所有接口都是用C#指定的。一些实现使用C++/CLI并调用boost库,另一些则是纯C#。单元测试是通用的,通用参数是被测试的实际实现

MSTest/vstest示例:

public class MyTest< T > where T : IMyInterface
{
    [TestMethod]
    public void foo() {...}
}

[TestClass]
public class TestCppCli : MyTest< CppCliImpl > {}

[TestClass]
public class TestCSharp : MyTest< CSharpImpl> {}
公共类MyTest其中T:IMyInterface
{
[测试方法]
公共void foo(){…}
}
[测试类]
公共类TestCppCli:MyTest{}
[测试类]
公共类TestCSharp:MyTest{}

不幸的是,我看不到使用(托管)设备的方法。BOOST_FIXTURE_TEST_案例只接受非托管类,而那些类不能容纳托管成员。