5

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

4

2 回答 2

5

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

首先,您需要使用本机 P/Invoke 调用打开文件描述符。这是由 OpenFileById WINAPI 函数完成的。这是在 MSDN上使用它的方法,这是在 MSDN 论坛上详细解释它的另一个链接,这里是关于如何构建 P/Invoke 调用的一些帮助 (pinvoke.net) 。

获得文件句柄后,您需要将其包装在 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# 中的任何其他文件或流。完成后不要忘记处理您的物品。

于 2009-01-29T22:27:48.317 回答
2

我能够通过使用_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();
    }       
}
于 2017-04-19T11:36:32.397 回答