将 std::exception 中的消息从托管代码传递到非托管代码

Passing message in std::exception from managed code to unmanaged

我正在尝试从托管代码中抛出一个 std::exception,以便它被非托管代码捕获。我挣扎的地方是传递一个字符串(描述异常),以便可以使用 what() 方法检查(重新)捕获的异常 ...

#pragma managed

static std::string InvokeMethod() {

    try {
      //...
    }
    catch (Exception^ ex) {
      std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->ToString());
      throw std::exception(myExMsg);
    }
  }
#pragma unmanaged

   void Execute() {
      try {
        myMethod = InvokeMethod();
      }
      catch (std::exception ex) {
        SetError(ex.what());
      }
    }

这不会编译 “没有构造函数实例”stdext:exceptipon::exception”匹配参数列表参数类型是 (std::string)” 但是如果我'hard code'一个字符串变成std::exception这样...

 throw std::exception("An error has occurred");

... 然后该字符串被传递并由 ex.what() 返回。我也试过了...

throw std::runtime_error(myExMsg);

... 但是 ex.what() 只是 returns 以 '\x7F' 结尾的字符串(以防万一)。

在我看来 std::exception 需要其他类型。但是什么类型的? 'myExMsg' 需要什么才能使 ex.what() returns 相同的字符串(可以在 SetError 方法中使用)?

根据@Joe 的建议,我继承自 std::exception ...

 class InvokeException : public std::exception {
  public:
    InvokeException(std::string const& message) : msg_(message) { }
    virtual char const* what() const noexcept { return msg_.c_str(); }

  private:
    std::string msg_;
  };

...然后...

const std::string myExMsg = msclr::interop::marshal_as<std::string>(ex->Message);
throw InvokeException(myExMsg);