我有一个函数将一个字符串解析为两个字符串.在C#中我会声明它是这样的:
void ParseQuery(string toParse, out string search, out string sort) { ... }
我会这样称呼它:
string searchOutput, sortOutput; ParseQuery(userInput, out searchOutput, out sortOutput);
当前项目必须在C++/CLI中完成.我试过了
using System::Runtime::InteropServices; ... void ParseQuery(String ^ toParse, [Out] String^ search, [Out] String^ sort) { ... }
但如果我这样称呼它:
String ^ searchOutput, ^ sortOutput; ParseQuery(userInput, [Out] searchOutput, [Out] sortOutput);
我得到一个编译器错误,如果我这样称呼它:
String ^ searchOutput, ^ sortOutput; ParseQuery(userInput, searchOutput, sortOutput);
然后我在运行时收到错误.我该如何申报和调用我的功能?
C++/CLI本身不支持真正的"out"参数,但您可以将引用标记为out参数,以使其他语言将其视为真正的out参数.
您可以为以下参考类型执行此操作:
void ReturnString([Out] String^% value) { value = "Returned via out parameter"; } // Called as String^ result; ReturnString(result);
对于价值类型:
void ReturnInt([Out] int% value) { value = 32; } // Called as int result; ReturnInt(result);
%使其成为'ref'参数,OutAttribute标记它仅用于输出值.
使用Visual Studio 2008,这可以解决我工作中的一个主要问题.谢谢!
// header // Use namespace for Out-attribute. using namespace System::Runtime::InteropServices; namespace VHT_QMCLInterface { public ref class Client { public: Client(); void ReturnInteger( int a, int b, [Out]int %c); void ReturnString( int a, int b, [Out]String^ %c); } } // cpp namespace VHT_QMCLInterface { Client::Client() { } void Client::ReturnInteger( int a, int b, [Out]int %c) { c = a + b; } void Client::ReturnString( int a, int b, [Out]String^ %c) { c = String::Format( "{0}", a + b); } } // cs namespace TestQMCLInterface { class Program { VHT_QMCLInterface.Client m_Client = new VHT_QMCLInterface.Client(); static void Main(string[] args) { Program l_Program = new Program(); l_Program.DoReturnInt(); l_Program.DoReturnString(); Console.ReadKey(); } void DoReturnInt() { int x = 10; int y = 20; int z = 0; m_Client.ReturnInteger( x, y, out z); Console.WriteLine("\nReturnInteger: {0} + {1} = {2}", x, y, z); } void DoReturnString() { int x = 10; int y = 20; String z = "xxxx"; m_Client.ReturnString(x, y, out z); Console.WriteLine("\nReturnString: {0} + {1} = '{2}'", x, y, z); } } }