Casting System :: IO :: FileStream ^到FILE *

时间:2014-09-30 06:18:38

标签: c++-cli managed

我正在努力将大量代码从非托管C ++程序集重构为C#程序集。目前,两者之间存在混合模式程序集,当然还有托管和非托管代码的混合。我试图在非托管C ++中调用一个函数,它依赖于FILE *(在stdio.h中定义)。这个函数与一个更大的进程联系在一起,这个进程无法重构到C#代码中,但是现在需要从托管代码中调用

我已搜索但无法找到System :: IO :: FileStream类使用的底层系统指针的确定答案。这仅仅是应用于文件*吗?或者是否有其他方法将FileStream ^转换为FILE *?我找到了FileStream :: SafeFileHandle,我可以在其上调用DangerousGetHandle()。ToPointer()来获取原生的void *,但我只是想确定如果我把它转换为FILE *我就是这样。做正确的事......?

void Write(FILE *out)
{
    Data->Write(out); // huge bulk of code, writing the data
}

virtual void __clrcall Write(System::IO::FileStream ^out)
{
    // is this right??
    FILE *pout = (FILE*)out->SafeFileHandle->DangerousGetHandle().ToPointer();
    Write(pout);
}

1 个答案:

答案 0 :(得分:1)

您需要_open_osfhandle followed by _fdopen

施法不是魔法。仅仅因为输入和类型输出适合您的情况并不代表值。