2011-03-22 12 views
2

我在C#應用程序中使用舊的C庫(構建爲DLL)。該庫中的一個功能需要傳遞一個FILE*(如ANSI C中定義的)。有什麼辦法可以在C#中使用System.IO.File,stdoutstderr來獲得FILE *句柄?獲取FILE *句柄傳遞給System.IO.File的C函數和默認流

還是有什麼辦法解決這個問題,任何想法,提示等...?

在此先感謝。

回答

2

我沒有試過,但它可能工作...

System.IO.File.Create()/ open()將返回一個FileStream,從那裏你可以使用FileStream.SafeFileHandle和那裏SafeFileHandle.DangerousGetHandle()會給你本地操作系統HANDLE。

然後,在非託管C中,_open_osfhandle()將使用您的HANDLE並返回一個int文件描述符。將它傳遞給_fdopen(),它將返回一個FILE *。

漫長的路線,有很多不兼容的機會和其他陷阱。但你可能很幸運!

+0

我明白了。我會考慮放棄該DLL。謝謝 – gd1 2011-03-22 21:56:48

+1

那是因爲它太麻煩了嗎? (不是一個不合理的觀點:你必須在你的C#應用​​程序和舊DLL之間插入一個新的C DLL,或者其他東西。)或者你嘗試過並發現它不起作用? – 2011-03-23 01:00:26

+0

我想過放棄DLL並在C#中重寫所有內容,但是我已經找到了該DLL的原始C源代碼(確實比較老),並對其進行了編輯,以便它不需要使用FILE *,但只是一個包含文件路徑的char *。所以C DLL創建,打開,寫入和關閉文件本身。這就像添加3行代碼,一切都很順利。 – gd1 2011-03-24 20:34:47