C#String vs std:string:传递字符串时出现问题

时间:2013-07-24 18:24:25

标签: visual-studio-2010 visual-c++ opencv image-processing c++-cli

请查看以下opencv代码

void ImageWriter::writeImage(Mat image)
{
    number++;
    String name="D:/OpenCV Final Year/Images/intruder";
    name+=number;
    name+=".bmp";

    //imwrite("D:/OpenCV Final Year/Images/intruder.bmp",image);
    imwrite(name,image);
}

在这里,我只能说imwrite()没有写任何东西!没有错误但没有输出。如果我使用imwrite()的评论版本,它会按预期工作。但我无法使用它,因为我需要写入多个图像,因此number整数变量完成的名称更改非常重要。我认为问题在于name字符串。

但是,此name类型为C#,因为std:string存在冲突。

如何让这个动态名称创建成功并让imwrite()生效?

2 个答案:

答案 0 :(得分:1)

只是想一想 你试过了吗?

  1. 使用char数组? (char[]
  2. StringStream
  3. 字符串格式而不是+=

答案 1 :(得分:1)

它不起作用,因为您试图将托管的.NET System :: String对象传递给期望std :: string的函数。看看这里的文档(OpenCV Documents C++ imwrite),它似乎期待一个const字符串&类型。

如果你用C#编写它,就没有办法'声明'std :: string对象。

我首先看看name.ToCharArray()是否有用。虽然这将生成托管数组,但编译器可能会计算出从托管字符数组到本机的所需转换。

在使用C ++ / CLI时,您需要将托管字符串封送为std格式:

#include <string>
using namespace std;
using namespace System;

void MarshalString (String^ s, string& os )
{
   using namespace Runtime::InteropServices;
   const char* chars = 
      (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(IntPtr((void*)chars));
}

void ImageWriter::writeImage(Mat image)
{
    number++;
    String name="D:/OpenCV Final Year/Images/intruder";
    name+=number;
    name+=".bmp";

    string nativeString;
    MarshalString(name, nativeString);

    imwrite(nativeString, image);
}