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