在c ++ / cli中升级库..退出“代码0xC0020001:字符串绑定无效”

时间:2012-05-04 04:31:44

标签: visual-studio-2010 boost c++-cli clr

我正在使用boost库来获取当前系统时间并且我的代码正常工作但是visualt studio 2010在程序之后退出。调试器在尝试释放不存在的指针时中断。我知道这是因为提升本机代码。如果我评论代码的提升部分没有错误。

直到现在我尝试使用MSDN中解释的#pragma但没有成功。有人可以给我一些建议。 (我也尝试过GetSystemTime函数来获取时间,但是我无法获得像boost这样的微秒细节。)

我的代码

#pragma managed(push, off)
void GetSystemDateTime(SDateTime& stimeblock);
#pragma managed(pop)

int main()
{

c++/cli code

SDateTime stimestruct[1];
//call to the function having the boost code..
GetSystemDateTime(stimestruct[0]);

}

功能定义

 #pragma managed(push, off)
  void GetSystemDateTime(SDateTime& timeblock)
    {

   // SYSTEMTIME time;
   // GetSystemTime(&time);
   // WORD millis = (time.wSecond * 1000) + time.wMilliseconds;

    boost::posix_time::ptime now  = boost::posix_time::microsec_clock::local_time();
    std::tm pt_tm = to_tm(now);
    std::cout <<  now << std::endl;
    //std::cout <<  time.wYear<< time.wMonth<<time.wDay //<<time.wHour<<time.wMinute<<time.wSecond<<time.wMilliseconds << std::endl;
    std::string timestring =  to_iso_string(now);
    std::string sYear  = timestring.substr (0,4);
    std::string sMonth = timestring.substr (4,2);
    std::string sDay   = timestring.substr (6,2);
    std::string sHour  = timestring.substr (9,2);
    std::string sMinute = timestring.substr (11,2);
    std::string sSecond = timestring.substr (13,2);
    std::string sUSecond = timestring.substr (16);

    istringstream isYear(sYear);
    istringstream isMonth(sMonth);
    istringstream isDay(sDay);
    istringstream isHour(sHour);
    istringstream isMinute(sMinute);
    istringstream isSec(sSecond);
    istringstream isUSec(sUSecond);
    // use is like an input stream
    int iYear,iMonth,iDay,iHour,iMinute,iSecond,iUSecond;
    isYear >> iYear;
    isMonth >>iMonth;
    isDay >>iDay;
    isHour >>iHour;
    isMinute >>iMinute;
    isSec >>iSecond;
    isUSec >>iUSecond;


    timeblock.uiYear = iYear;
    timeblock.usiMonth = time.wMonth;
    timeblock.usiDay = time.wDay;
    timeblock.usiHour = time.wHour;
    timeblock.usiMinute = time.wMinute;
    timeblock.usiSec = time.wSecond;

    timeblock.udiUSec = time.wMilliseconds;

    // Display version information

    }

3 个答案:

答案 0 :(得分:2)

我在C ++ / CLI程序集中看到了由using a static variable in native code引起的这个错误。

我发现的唯一解决方法是删除静态变量,例如,将其移动到类或文件范围。

但是,如果此静态变量位于boost代码中,那么这样做可能并不容易/可能。在这种情况下,您可以创建一个单独的C ++文件,该文件在没有/clr的情况下编译,使用该文件中的boost函数,并将其链接到您的C ++ / CLI程序集。

此错误似乎是由编译器生成错误代码引起的。我filed a bug with Microsoft,已关闭“将无法修复”,但编译器团队在回复中提供了其他一些解决方法。

答案 1 :(得分:0)

尝试使用

#pragma managed(push, off)
#pragma managed(pop)

所有提升头文件的#include行。

答案 2 :(得分:0)

我现在几天都遇到了同样的问题。

这是我找到的最好的解决方法。并解释了为什么会这样。

查看结尾(编号7和9)

希望这有助于http://www.codeproject.com/Articles/442784/Best-gotchas-of-Cplusplus-CLI