2011-04-14 113 views
12

我正在開發Visual Studio 2008 C#for 64bit,我想用它來使用一個使用boost的庫。所以我在C++/CLI中編寫了一個包裝器。我設法目標我去boost mutex C++/CLI問題

#include <boost/thread/mutex.hpp>. 

錯誤。如果我包括在我的C任何文件++/CLI的包裝,其本身包括<boost/thread/mutex.hpp>,或者如果我直接將其包含在包裝我得到一個「System.AccessViolationException」「試圖讀取或寫入受保護的內存,這通常表示其他內存已損壞。「

我非常在意爲64位構建所有東西,所以我懷疑問題出在那裏。當我在「普通」C++中使用64位相同的庫時,一切正常。我來了幾個帖子,其中人們似乎有與助推線程類似的問題,但沒有我找到的解決方案工作。有人有想法嗎?

+0

你的意思是'boost :: asio'由一個庫使用'boost :: thread'嗎?無論如何,一旦我確實想使用'boost :: asio',並最終在我的本地小庫中以winsock結尾,並被C++/Cli包裝。我很抱歉,'boost'不是直接與C++/Cli聯繫的合適的庫。儘量避免它。 – 2011-04-14 22:22:25

回答

8

問題是,boost.thread使用某些#pragma section指令,這些指令在構建時沒有/ clr時不兼容,而是靜態鏈接到使用/ clr的代碼。

我聽說用/ clr重建boost.thread(即調用bjam時通過cxxflags="/clr")可以解決問題,但我沒有親自嘗試過。

我假設動態鏈接到boost.thread(而不是靜態的,這是VC++的默認值; #define BOOST_THREAD_DYN_LINK在包含任何提升標頭之前)應該可以工作,但是我還沒有嘗試過。

如果這樣不起作用,請嘗試使用Google搜索boost的一些組合threadclrtls;你應該在boost郵件列表中找到相當多的帖子,因爲這是舊的問題。


編輯:由於拉曼夏爾馬(微軟高級PM)評論here,甚至std::mutex不使用/ clr支持的,所以它是沒有真正的驚喜,boost.thread的互斥的實施不是非此即彼。

2

正如其他答案所述,tss_pe.cpp中的boost的編譯指示與CLR不兼容。對該文件進行簡單的修改可以修復問題,並允許靜態鏈接。我對Boost 1.44的修改版本是here(針對更改所做的差異與this)。

0

某些Boost庫不能與C++ CLI代碼靜態鏈接,否則編譯器可能會爲某些Windows版本生成不兼容的映像。 就我而言,當我在Windows 10下使用VC++ 2017靜態構建Boost 1.64 x86線程庫時,我很困難。 在Windows 10下,二進制工作正常但提出了System.BadImageFormatException Windows 7. 該問題位於Boost線程庫中,我最初靜態鏈接到我的C++ CLI程序集。

這裏是一個短碼來容易地重新產生問題:

TESTCLI。ħ - C++ CLI裝配故障代碼

#pragma comment(lib, "libboost_thread-vc141-mt-1_64.lib") // static link makes the program crash under W7 

namespace testcli 
{ 
    public ref class TestClass { public: static void Test(){} }; 
} 

Program.cs的 - C#客戶端代碼加載 'TESTCLI'

using testcli; 

namespace Cli 
{ 
    class Program { static void Main(string[] args) { new TestClass(); } } // instanciate C++ CLI Boost class 
} 

通過提高System.BadImageFormatException上述返回的代碼(異常可以在應用程序事件查看器中找到)。

如果TESTCLI被改變,使得升壓線程庫現在動態鏈接:

testcli.h - C++ CLI組件成功代碼

#pragma comment(lib, "boost_thread-vc141-mt-1_64.lib") // dynamic link works fine under any Windows 

namespace testcli 
{ 
    public ref class TestClass { public: static void Test(){} }; 
} 

代碼現在成功返回。

注意這裏解釋說,你可以定義的,而不是BOOST_ALL_DYN_LINK BOOST_THREAD_DYN_LINK:http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html

這樣做,你就不必包裝所有您的應用程序加速動態庫。