增强互斥C ++ / CLI问题

| 我正在使用Visual Studio 2008 C#for 64bit开发程序,并且我想使用一个使用boost的库。所以我用C ++ / CLI写了一个包装器。我设法解决了我遇到的错误
#include <boost/thread/mutex.hpp>.
如果我在C ++ / CLI包装器中包含任何本身包含ѭ1的文件,或者如果我直接将其包含在包装器中,则会得到\“ System.AccessViolationException \” \“试图读取或写入受保护的内存。这通常是一种指示其他内存已损坏。\“ 在为64位构建所有组件时,我非常谨慎,因此我怀疑问题是否存在。当我在\“ plain \” C ++中以64位使用同一库时,一切正常。我看过几篇文章,那里的人似乎对boost线程也有类似的问题,但是我发现这些解决方案都没有用。有人有主意吗?     
已邀请:
问题是boost.thread使用了一些不带/ 2指令的ѭ2指令,而这些指令在没有/ clr的情况下构建,然后静态链接到使用/ clr的代码。 我听说用/ clr重建boost.thread(即在调用bjam时传递ѭ3es)可以解决此问题,但我还没有亲自尝试过。 我认为动态链接到boost.thread(而不是静态地链接,这是VC ++的默认值;在包含任何boost头之前为
#define BOOST_THREAD_DYN_LINK
)也应该可行,但是我没有尝试过。 如果这样不起作用,请尝试使用Google搜寻
boost
thread
clr
tls
的某种组合;您应该在boost邮件列表中找到很多关于它的帖子,因为这是一个老问题。 编辑:正如Raman Sharma(微软高级副总裁)在这里评论的那样,/ clr甚至不支持
std::mutex
,因此boost.thread的互斥量实现也不是真的不足为奇。     
就像另一个答案所说的那样,tss_pe.cpp中boost的编译指示与CLR不兼容。对该文件进行简单修改即可解决该问题,并将允许静态链接。我的Boost 1.44的修改版本在这里(与之相对的是所做的更改)。     
某些Boost库不得与C ++ CLI代码静态链接,否则编译器可能会为某些Windows版本生成不兼容的映像。 就我而言,在Windows 10下使用带有VC ++ 2017的Boost 1.64 x86线程库静态构建Boost.64时,我很难解决这个问题。 该二进制文件在Windows 10下工作正常,但在Windows 7下引发了System.BadImageFormatException。 问题位于Boost线程库中,该线程库最初是我静态链接到C ++ CLI程序集的。 这是一个简短的代码,可以很容易地重现该问题: 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动态库与您的应用程序打包在一起。     

要回复问题请先登录注册