最近做一小程序,其中部分功能用C++,部分功能用C#,兩個程序需要互相調用。而且兩個程序都是帶界面的。以前沒有做過C#和C++的相互調用,雖然知道C#可以調用C++的DLL,但是我對C++創建dll不夠熟悉,而且感覺將此程序中的C++功能做成dll不方便,於是就想將C#和C++做成兩個獨立程序,通過進程通信實現互相調用。
從網上找了一篇命名管道實現進程通信的文章,可以按照這個做,順便把文章轉載一下。
以下為轉載文章。
本文只是一個測試例子,核心代碼是kernel32.dll中的一組windows api函數,這裡不深入研究,代碼都在codeproject上。
http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx
測試效果如下,可以做到aspx和給console app發送消息後得到反饋:
console app為服務器端代碼如下
usingSystem;
usingAppModule.InterProcessComm;
usingAppModule.NamedPipes;
usingSystem.Threading;
namespaceServer
{
classProgram
{
//**c#中用namedpipe進程間通信
//**組件代碼來自codeproject
//**http://www.codeproject.com/KB/threads/dotnetnamedpipespart1.aspx
//**下載上面鏈接中的代碼,編譯AppModule.InterProcessComm和AppModule.NamedPipes兩個dll
//**引用這兩個dll到本例中,運行如下代碼作為服務器端測試
//**測試代碼byjinjazz(因為原作者的兩個測試程序比較復雜,這裡簡化後供大家參考)
staticvoidMain(string[]args)
{
ServerPipeConnectionPipeConnection=newServerPipeConnection("np-test-by-jinjazz",512,512,5000,false);
Console.WriteLine("listening..");
while(true)
{
try
{
PipeConnection.Disconnect();
PipeConnection.Connect();
stringrequest=PipeConnection.Read();
if(!string.IsNullOrEmpty(request))
{
Console.WriteLine("get:"+request);
PipeConnection.Write("get:"+request);
if(request.ToLower()=="break")break;
}
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
break;
}
}
PipeConnection.Dispose();
Console.Write("pressanykeytoexit..");
Console.Read();
}
}
}
客戶端的aspx代碼如下
usingSystem;
usingSystem.Web;
usingAppModule.InterProcessComm;
usingAppModule.NamedPipes;
publicpartialclass_Default:System.Web.UI.Page
{
protectedvoidPage_Load(objectsender,EventArgse)
{
Response.Write(SendRequest("測試asdf"));
}
///<summary>
///測試namepiped客戶端
///</summary>
///<paramname="request">發送命令</param>
///<returns>返回數據</returns>
stringSendRequest(stringrequest)
{
stringresponse="";
IInterProcessConnectionclientConnection=null;
try
{
clientConnection=newClientPipeConnection("np-test-by-jinjazz",".");
clientConnection.Connect();
clientConnection.Write(request);
response=clientConnection.Read();
clientConnection.Close();
}
catch(Exceptionex)
{
clientConnection.Dispose();
response=ex.Message;
}
returnresponse;
}
}
測試環境為windows vista和windows2003