2013-04-24 3 views
3

프로그램 (모델)의 코드가 포함 된 Visual Studio 프로젝트가 있습니다. 나는 부스트 테스트를하기 위해 다른 프로젝트를 만들었다.BoostTest를 C++/CLI와 함께 사용 : 가능한가요?

문제는 제대로 작동하지 않는다는 것입니다.

프로젝트에서 Boost 테스트를 단독으로 사용할 수 있지만 테스트를 실행하려는 첫 번째 프로젝트 (참조 등)에 링크하자 마자 부스트 테스트 프로젝트가 ' t 컴파일은 :

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 

나는 there 것을 읽을 당신이 할 수없는

코드가 C++ 그러나 "C++ CLI"따라서 당신 캔트 사용 부스트되지이다. C++에는 System 네임 스페이스가 없습니다. 각 .cpp 파일에서 C++/CLI (따라서 System 네임 스페이스) 또는 부스트를 사용할 수 있습니다. 당신이 부스트를 들어, "일반적인 Langauge 런타임 지원"을 활성화해야 시스템 네임 스페이스를 사용하려면 당신은 누군가가 C와 부스트를 사용할 수 없습니다 확인할 수 있습니다 그것을

를 >> 해제해야 ++/CLI 프로그램?

답변

2

예, 가능합니다.

먼저 C++/CLI 프로젝트를/clr (/ clr : pure 또는/clr : safe가 작동하지 않음)으로 변경해야합니다. 이렇게하면 프로젝트가 혼합 모드 (native C++과 관리 코드 모두를 실행)에서 실행될 수 있습니다.
Read more on msdn.microsoft.com

비주얼 스튜디오 (부스트의 .H 경로를 추가하고, 링커에 lib 디렉토리 경로를 추가하기위한 Boost.Test을 설정하고, 경우에 따라서는 "헤더 아니기 때문에 당신이 부스트를 컴파일해야 할 수도 있습니다 "); 여기에 좋은 자습서가 있습니다. itee.uq.edu.au

그게 전부입니다. 테스트를 작성하고 컴파일 할 수 있습니다.

그러나 C++/CLI 코드와 Boost의 컴파일 (가장 가능성있는 연결) 버그로 인해 Boost 테스트를 다른 프로젝트에 적용 할 수 없었습니다. 그래서 나는 단위 테스트를 프로그램 자체의 코드 안에 넣어야했다. (받아 들일 수있는 해결책 인 별도의 .cpp 파일에).

+0

불행하게도 내가 사용하는 방법을 볼 수 없습니다 비품을 (관리). BOOST_FIXTURE_TEST_CASE는 관리되지 않는 클래스 만 수락하며 관리되는 멤버를 보유 할 수 없습니다. – TobiMcNamobi

2

기본 문제는 부스트와 같은 C++ (비 CLI) 코드에서 관리되는 참조 또는 포인터를 보유 할 수 없다는 것입니다.

C++/CLI 코드의 경우 C# 테스트 프레임 워크를 사용하는 것이 일반적으로 좋습니다. C#은 순수 C++ 부분과 통신 할 수있는 C++/CLI 부분과 통신 할 수 있습니다. 또한 C++/CLI의 대부분의 유스 케이스는 .Net 용 C++ 또는 C 코드를 래핑하므로 .Net이 볼 수있는 인터페이스를 테스트하는 것은 자연스러운 선택입니다.

예를 들어 모든 인터페이스가 C#으로 지정된 프로젝트가 있습니다. 일부 구현은 C++/CLI를 사용하고 부스트 라이브러리를 호출하며, 나머지는 순수한 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> {}