2012-09-25 22 views
4

我正在嘗試將一個C#dll調用移植到F#。如何通過引用的參數調用F#中的外部函數?

C#的調用是:

[DllImport("swedll32.dll", CharSet = CharSet.Ansi, EntryPoint = "swe_revjul")] 
private extern static double ext_swe_revjul(double tjd, int gregflag, ref int year, ref int month, ref int day, ref double hour); 

我試過在半打方式來寫這在F#中,但都無濟於事(至少!)。 其中:

[<DllImport("swedll32.dll", CharSet = CharSet.Ansi, EntryPoint = "swe_revjul")>] 
extern double ext_swe_revjul (double tjd) (gregflag:int) (year: int byref) (month: int byref) (day: int byref) (hour: double byref); 

或者:

let ext_swe_revjul double (tjd:double) (gregflag:int) (year: int byref) (month: int byref) (day: int byref) (hour: double byref) 

我試圖用一個限定詞或寫入按地址「一:按地址」 - 能有人幫幫我嗎?非常感謝您提前!

暫時失意的科學家,誰只想得到他的公式:-)

回答

5

嘗試

extern static double ext_swe_revjul(double tjd, int gregflag, int* year, int* month, int* day, double* hour) 

宣言應該或多或少的C簽名相匹配。

編輯:

由於ildjarn指出,

extern static double ext_swe_revjul(double tjd, int gregflag, int& year, int& month, int& day, double& hour) 

可能會更好。

+2

這會起作用,但我認爲'int&'和'double&'會更接近C#代碼的語義。 – ildjarn

+1

好點。儘管我會推薦匹配C sig,無論如何。 – Daniel

+0

非常感謝你,我通過http://pblasucci.wordpress.com/2012/07/23/managing-pointers-or-fs-platform-invoke-gotcha/發現了兩者之間的區別。 。一個聲明使用非託管指針,另一個聲明使用託管指針。 – Wolfgang

相關問題