【问题标题】:Get a FILE* handle to be passed to a C function for System.IO.File and default streams获取 FILE* 句柄以传递给 System.IO.File 和默认流的 C 函数
【发布时间】:2011-03-22 21:29:00
【问题描述】:

我在我的 C# 应用程序中使用旧的 C 库(构建为 DLL)。此库中的函数之一需要传递FILE*(在 ANSI C 中定义)。有什么方法可以在 C# 中为 System.IO.Filestdoutstderr 获取 FILE* 句柄?

或者有什么办法可以解决这个问题,有什么想法、提示等等...?

提前致谢。

【问题讨论】:

    标签: c# .net dll file-handling crt


    【解决方案1】:

    我还没有尝试过,但它可能会起作用......

    System.IO.File.Create()/Open() 将返回一个 FileStream,您可以从那里使用 FileStream.SafeFileHandle,从那里 SafeFileHandle.DangerousGetHandle() 将为您提供本机操作系统 HANDLE。

    然后在非托管 C 中,_open_osfhandle() 将获取您的 HANDLE 并返回一个 int 文件描述符。将此传递给 _fdopen(),它将返回一个 FILE*。

    一条很长的路,有很多不兼容和其他问题的机会。但你可能很幸运!

    【讨论】:

    • 我明白了。我会考虑删除那个DLL。谢谢
    • 是不是太麻烦了? (不是一个不合理的观点:你必须在你的 C# 应用程序和旧 DLL 之间插入一个新的 C DLL 等等。)或者你试过发现它不起作用?
    • 我曾想过删除 DLL 并用 C# 重写所有内容,但我找到了该 DLL 的原始 C 源代码(确实很旧)并对其进行了编辑,使其不需要使用一个 FILE*,但只是一个包含文件路径的 char*。因此 C DLL 创建、打开、写入和关闭文件本身。就像添加了 3 行代码,一切都很顺利。
    • 这个建议听起来并不难,而且好像它应该可以工作,并且是我正在寻找的(虽然我花了几次尝试才找到它,可能是因为 Q 标记不足)。我实际上想在 C 中获得一个测试记录函数来写入在 C# 测试驱动程序中打开的日志,所以 gd1 的方法不起作用 - 顺便说一下,我发现它 less 在他的情况下优雅但更可靠简单。在我找到这个之前,我拆分了一个 C 函数,在 malloced 字符串中生成文本;我经常发现自己不确定是编写这样的格式化程序还是直接写入文件!
    猜你喜欢
    • 2018-03-01
    • 2013-06-04
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 2013-12-22
    相关资源
    最近更新 更多