我想在Fortran程序和C#程序之间建立一个管道。Fortran程序将负责处理重要任务,而C#程序将提供一个“视图”,以查看从Fortran程序发送的数据。为了检查这是否可行,我编写了两个小程序。(Fortran代码是从在C++和C#之间传输数据的示例中获取的。)
Fortran代码:
C# 代码:
如果我启动这两个程序,我会看到Fortran代码创建了一个管道,并且进入了
Fortran代码:
PROGRAM Test
USE kernel32
IMPLICIT NONE
! Data pipe
INTEGER*4 EqnData /100/
! Paths for pipes
CHARACTER*128 dataname /'\\.\pipe\EqnData'/
INTEGER(HANDLE) :: pipe1
pipe1 = CreateNamedPipe('\\\\.\\pipe\\EqnData'C, PIPE_ACCESS_DUPLEX, &
PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, &
1024, 1024, 120 * 1000, NULL)
PRINT*, pipe1
! Open data pipe
OPEN(UNIT=EqnData, FILE=dataname, ACCESS='STREAM', STATUS='OLD')
READ*
! Close pipe
CLOSE(EqnData)
WRITE (*,*) 'end'
END
C# 代码:
using System;
using System.IO;
using System.IO.Pipes;
class PipeClient
{
static void Main(string[] args)
{
using (NamedPipeClientStream pipeClient
= new NamedPipeClientStream(".",
"EqnData",
PipeDirection.InOut))
{
// Connect to the pipe or wait until the pipe is available.
Console.Write("Attempting to connect to pipe...");
pipeClient.Connect();
Console.WriteLine("Connected to pipe.");
Console.WriteLine("There are currently {0} pipe server instances open.",
pipeClient.NumberOfServerInstances);
using (StreamReader sr = new StreamReader(pipeClient))
{
// Display the read text to the console
string temp;
while ((temp = sr.ReadLine()) != null)
{
Console.WriteLine("Received from server: {0}", temp);
}
}
}
Console.Write("Press Enter to continue...");
Console.ReadLine();
}
}
如果我启动这两个程序,我会看到Fortran代码创建了一个管道,并且进入了
READ
语句,但是C#代码只到达了pipeClient.Connect()
然后就一直停在那里。
我是否正确设置了C#部分的内容?或者可能我在Fortran方面做得不太对,以至于C#客户端“看到”管道?