某些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
这样做,你就不必包装所有您的应用程序加速动态库。
你的意思是'boost :: asio'由一个库使用'boost :: thread'吗?无论如何,一旦我确实想使用'boost :: asio',并最终在我的本地小库中以winsock结尾,并被C++/Cli包装。我很抱歉,'boost'不是直接与C++/Cli联系的合适的库。尽量避免它。 – 2011-04-14 22:22:25