Некоторые библиотеки Boost не должны быть статически связаны с кодом CLI C ++, иначе компилятор может создать несовместимый образ для некоторых версий Windows.
Насколько мне известно, мне было трудно разобраться в проблеме при статическом построении с библиотекой потоков Boost 1.64 x86 с VC ++ 2017 под windows 10.
Двоичный файл работал нормально в Windows 10, но вызвал System.BadImageFormatException в Windows 7.
Проблема была обнаружена в библиотеке потоков Boost, которую я изначально статически связывал со своей сборкой CLI C ++.
Вот краткий код, который легко воспроизводит проблему:
testcli.h - 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 изменен, и библиотека потоков Boost теперь связана динамически:
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_THREAD_DYN_LINK вместо BOOST_ALL_DYN_LINK, как описано здесь: http://www.boost.org/doc/libs/1_64_0/doc/html/thread/build.html
Для этого вам не придется упаковывать все динамические библиотеки Boost с вашим приложением.