当前位置:编程学习 > C#/ASP.NET >>

在CLR的Form程序中, 想使用Boost::regex, 但是只要include<boost/regex>, 程序启动时就崩溃了

环境:
VC2008, VC2010, boost 1.48 , 1.53 均能都能重现

重现步骤:
1. "New Project"->"Visual C++"->"CLR"->"Windows Forms Application" ==OK
2. 在stdafx.cpp中加入: #include <boost/regex.hpp>
3. 在项目属性C++, Linker加上boost目录
C++  :  $(BOOST_DIR)
Linker: $(BOOST_DIR)\stage\lib
4. 修改Commoon Language Runtime Support才能编译通过, (默认是/clr:pure)
 General->"Commoon Language Runtime Support"-->(/clr)

编译运行就Crash了, Debug版显示call stack:
msvcr100d.dll!_msize_dbg
msvcr100d.dll!_dllonexit_nolock
msvcr100d.dll!__dllonexit
TBForm.exe!_onexit
TBForm.exe!atexit
TBForm.exe!boost::re_detail::`dynamic initializer for 'block_cache''()
[Managed to Native Transition]
TBForm.exe!_initterm
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::InitializeNative()
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::_Initialize()
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::Initialize()
TBForm.exe!?.cctor@@$$FYMXXZ()

其中TBForm.exe!boost::re_detail::`dynamic initializer for 'block_cache''()指向的位置是:
regex.cpp 195行:

#ifdef BOOST_HAS_THREADS
mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, };    ------>这一行
#else
mem_block_cache block_cache = { 0, 0, };
#endif

本来是用C++实现了功能的代码, 想用.net的Form来简化界面的编程, 因为功能的代码中用到了boost::regex, 程序一运行就出错, 根本就没有进入自己的代码中, 由于对.net不熟悉, 请教各位高手这是怎么回事, 如何解决或回避这个问题?
clr Boost RegEx C++ --------------------编程问答-------------------- VC.Net 不太懂,建议用C#写,可以用Dllimport引用C++。 --------------------编程问答-------------------- vc2010的stl里已经有regex的实现,但vc2008还没有, 但是我现在使用的都是vc2008,
vc2010stl的regex头文件包含不会出现这个问题。

有谁知道如何解决吗? --------------------编程问答-------------------- 没有用过boost。具体的解决方案没有
不过msdn里面有说,混合程序集使用静态变量会引起程序的死锁。
最好把静态变量放在
 #pragma unmanaged  中。
--------------------编程问答-------------------- 暂时用VC2010的stl绕开这个问题, 但这样也使用不了Stlport了, 不知道如何能解决这个问题.

我尝试过把boost的
mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, };    ------>这一行
#else
mem_block_cache block_cache = { 0, 0, };
#endif

全局变量变成函数里的静态变量,像
mem_block_cache& getMemBlockCache()
{
#if ...
static mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, };    ------>这一行
#else
static mem_block_cache block_cache = { 0, 0, };
#endif

return block_cache;
}

启动时过了, 但运行时又在boost的另一处静态变量出错, 就放弃了.

补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,