2014-01-14 61 views
2

我正在嘗試製作一個C++應用程序,該應用程序將結果返回給C#應用程序,該應用程序可以顯示或打印到控制檯。C#/ C++調用C++應用程序並獲取輸出結果

例如,在我的C++文件:

int main(int argc, char* argv[]){ 
    // code 
    some_method_to_return_result("result"); 
} 

在我的C#應用​​程序

System.Diagnostics.Process.Start("exec.exe", "arguments"); 
some_method_to_get_result(); 

我怎麼能做到這一點?

回答

0

我想你對使用C#生成進程時可用的信息有些困惑。你不能直接調用C++方法,你需要一堆我不知道的難看的互操作代碼。你可以從你的C++應用程序得到的是main的返回碼(1或0)。類似下面的內容會使它成功,因此result會在C++應用程序執行完成後保留其返回狀態。

Process P = System.Diagnostics.Process.Start("exec.exe", "arguments"); 
P.WaitForExit(); 
int result = P.ExitCode; 

如果你想從C獲取其他數據,+ +應用程序,你需要做編組一些研究,我又不是真的上懂行的,但我覺得這MSDN文章可能是一個很好的起點; http://msdn.microsoft.com/en-us/library/eaw10et3(v=vs.110).aspx

4

最好的方法是將C++應用程序組織爲一個DLL,並從.NET進程(C#)中調用此DLL。在這種情況下,你將只有一個進程。從C#調用C++非常有效。在某些情況下編組數據可能會很棘手。在簡單的情況下,它很簡單。保持你的數據格式簡單。

原型的C++函數應該在C#這樣的:

[DllImport("avifil32.dll")] 
private static extern void AVIFileInit(); 

搜索C# dllimportC# extern瞭解詳情。

0

在C++中的結果寫到標準輸出:

std::cout << "result"; 

在C#中使用Process.StandardOutput.ReadLine或類似方式攫取C++應用程序的標準輸出。

0

也許不是最好的解決辦法,但可能是最容易是寫在你的C++代碼的一些文件,並在你的C#代碼讀取它:

//c++ 
int main(int argc, char* argv[]){ 
    ofstream fileToWrite; 
    fileToWrite.open ("file.txt"); 
    fileToWrite << some_method_to_return_result("result"); 
    fileToWrite.close(); 
} 

//c# 
string data; 
    using (StreamReader reader = new StreamReader("file.txt")) 
    { 
     data = reader.ReadLine(); 
    } 
0

像這樣的事情?

using (Process p = new Process()) 
{ 
    p.StartInfo.FileName = "filename.exe"; 
    p.StartInfo.Arguments = "params"; 
    p.StartInfo.UseShellExecute = false; // use CreateProcess 
    p.StartInfo.RedirectStandardOutput = true; // get stdout 
    p.StartInfo.RedirectStandardError = true; // get stderr 
    p.StartInfo.CreateNoWindow = true; 

    p.Start(); 

    string line; 
    while (!p.StandardOutput.EndOfStream) 
    { 
     line = p.StandardOutput.ReadLine(); 
     Console.WriteLine(line); 
    } 

    if (!p.StandardError.EndOfStream) 
    { 
     Console.WriteLine("Error: " + p.StandardError.ReadToEnd()); 
    } 

} 

順便說一句,這段代碼是從我寫很久以前寫的一個真實世界的應用程序中提取出來的。