在C#中打开与文件描述符的管道连接

时间:2008-10-29 04:49:11

标签: c# .net winapi pinvoke file-descriptor

我有一个遗留应用程序,它从文件描述符3中读取来自客户端程序的消息。这是一个外部应用程序,所以我无法更改它。客户端是用C#编写的。我们如何在C#中打开与特定文件描述符的连接?我们可以使用像AnonymousPipeClientStream()这样的东西吗?但是我们如何指定要连接的文件描述符?

2 个答案:

答案 0 :(得分:4)

不幸的是,如果没有P / Invoking到本机Windows API,你将无法做到这一点。

首先,您需要使用本机P / Invoke调用打开文件描述符。这是由OpenFileById WINAPI函数完成的。 {2}在MSDN上,Here's how to use it在MSDN论坛上详细解释,here's an other link如何构建您的P / Invoke调用。

获得文件句柄后,需要将其包装在SafeFileHandle中,这次是安全的托管C#:

// nativeHandle is the WINAPI handle you have acquired with the P/Invoke call
SafeFileHandle safeHandle = new SafeFileHandle(nativeHandle, true);

现在您可以直接打开文件流:

Stream stream = new FileStream(safeHandle, FileAccess.ReadWrite);

从这一点开始,您可以将其用作C#中的任何其他文件或流。一旦完成,不要忘记丢弃物品。

答案 1 :(得分:1)

我能够使用_get_osfhandle解决同样的问题。例如:

using System;
using System.IO;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;

class Comm : IDisposable
{
    [DllImport("MSVCRT.DLL", CallingConvention = CallingConvention.Cdecl)]
    extern static IntPtr _get_osfhandle(int fd);

    public readonly Stream Stream;

    public Comm(int fd)
    {
        var handle = _get_osfhandle(fd);
        if (handle == IntPtr.Zero || handle == (IntPtr)(-1) || handle == (IntPtr)(-2))
        {
            throw new ApplicationException("invalid handle");
        }

        var fileHandle = new SafeFileHandle(handle, true);
        Stream = new FileStream(fileHandle, FileAccess.ReadWrite);
    }

    public void Dispose()
    {
        Stream.Dispose();
    }       
}