C ++ / CLI和.NET输出字符串参数

时间:2017-03-16 16:34:03

标签: c# c++-cli

在C#中,我有这个方法(.net framework 2.0)

 public String Authenticate( String configUrl, out String tokenId)

我想从托管c ++代码中调用它 我有

__authenticator->Authenticate(  gcnew System::String(hostUrl),gcnew System::String(temp));

但是tokenId又回来了。

我已经看到一些答案谈论在C#中使用^%,但这不会编译。

2 个答案:

答案 0 :(得分:3)

使用

public String Authenticate(String configUrl, out String tokenId)

__authenticator->Authenticate(
    gcnew System::String(hostUrl),
    gcnew System::String(temp)
);

,在C#中,等同于(考虑Authenticate的签名)

__authenticator.Authenticate(
    new String(hostUrl),
    out new String(temp)
);

但是在C#中你不能做out new Something,你只能out到变量,字段......所以在C#你需要这样做:

String temp2 = new String(temp);

__authenticator.Authenticate(
    new String(hostUrl),
    out temp2
);

并且,考虑到参数位于out,您可以:

String temp2;

__authenticator.Authenticate(
    new String(hostUrl),
    out temp2
);

现在,在C ++ / CLI中你有

System::String^ temp2 = gcnew System::String(temp);

__authenticator->Authenticate(
    gcnew System::String(hostUrl),
    temp2
);

或者,知道temp2out(请注意,refout之间的区别仅由C#编译器检查,而不是由C ++ / CLI检查编译器)

// agnostic of the out vs ref
System::String^ temp2 = nullptr;

// or knowing that temp2 will be used as out, so its value is irrelevant
// System::String^ temp2;

__authenticator->Authenticate(
    gcnew System::String(hostUrl),
    temp2
);

答案 1 :(得分:1)

好的,我知道了,让我在String ^

中传递参数
CString hostUrl;
String^ temp ;
String^ error = __authenticator.get() == nullptr ? "failed to get token" : 
                 __authenticator->Authenticate(  gcnew System::String(hostUrl),temp);