如何通过引用参数调用F#中的外部函数?

mar*_*est 4 pinvoke f# external pass-by-reference

我正在尝试将C#dll-Call移植到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);
Run Code Online (Sandbox Code Playgroud)

我试图用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);
Run Code Online (Sandbox Code Playgroud)

要么:

let ext_swe_revjul double (tjd:double) (gregflag:int) (year: int byref) (month: int byref) (day: int byref) (hour: double byref )
Run Code Online (Sandbox Code Playgroud)

我尝试使用限定符或"a:byref"编写byref - 有人可以帮助我吗?非常感谢你提前!

暂时沮丧的科学家谁只想得到他的公式:-)

Dan*_*iel 6

尝试

extern static double ext_swe_revjul(double tjd, int gregflag, int* year, int* month, int* day, double* hour)
Run Code Online (Sandbox Code Playgroud)

声明应该或多或少地与C签名匹配.

编辑:

正如ildjarn指出的那样,

extern static double ext_swe_revjul(double tjd, int gregflag, int& year, int& month, int& day, double& hour)
Run Code Online (Sandbox Code Playgroud)

可能会更好.

  • 这将有效,但我认为`int&`和`double&`将更接近地匹配C#代码的语义. (2认同)