我正在將大量代碼從非託管C++程序集重構到C#程序集。目前有兩種混合模式彙編,當然是混合使用託管代碼和非託管代碼。有一個函數我試圖調用非託管C++,它依賴於FILE * s(在stdio.h中定義)。這個函數綁定到一個更大的過程中,這個過程不能被重構成C#代碼,但是需要從託管代碼中調用哪個現在。Casting System :: IO :: FileStream ^到FILE *
我已經搜索,但無法找到System :: IO :: FileStream類使用什麼樣的基礎系統指針的明確答案。這只是應用在FILE *之上嗎?或者有其他方法可以將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);
}
看起來像你最好的選擇。似乎沒有任何保證,但「操作系統文件句柄」實際上是一個文件*。但如果是這樣,似乎不太可能改變。您可能不得不通過GC.KeepAlive在本地代碼中釋放句柄。 – heinrichj 2014-09-30 06:52:07
這是否有任何區別?如果數據很大,我預計開銷很小...... – 2014-09-30 07:01:33
不,FILE是一個嚴格的C運行時抽象,與Windows句柄無關。您可以使用_fdopen()對32位代碼進行破解。 – 2014-09-30 09:40:15