Search code examples
f#dllimport

F# ignores CallingConvention set in DllImport attribute?


While trying to call function with following signature (compiled by MSVC++):

BOOL CreateJunctionPoint(LPCTSTR szMountDir, LPCTSTR szDestDir);

and described in F# as

[<DllImport("FSLinks.dll", CallingConvention = CallingConvention.Cdecl)>]
extern int CreateJunctionPoint(string source, string target)

I get stack imbalance.

The same function called from C# works perfectly.

After changing calling convention to stdcall in C++:

 BOOL  __stdcall CreateJunctionPoint(LPCTSTR szMountDir, LPCTSTR szDestDir);

F# program begin working normally (though still having CallingConvention = CallingConvention.Cdecl set) Seems like obvious compiler bug to me.

Both compilers are from Visual Studio 2010 (Microsoft (R) F# 2.0 Compiler build 4.0.30319.1)


Solution

  • Yes, this is a known bug.

    http://connect.microsoft.com/VisualStudio/feedback/details/612713/f-ignores-callingconvention-for-dllimport