Next: Using pragma foreign_export for C#, Previous: Using pragma foreign_export_enum for C#, Up: Interfacing with C# [Contents]
The C# code from C# ‘pragma foreign_proc’ declarations
will be placed in the bodies of static member functions
of an automatically generated C# class.
Since such C# code will become part of a static member function,
it must not refer to the this
keyword.
It may however refer to static member variables or static member functions
declared with ‘pragma foreign_code’.
The input and output variables for a C# ‘pragma foreign_proc’ will have C# types corresponding to their Mercury types. The exact rules for mapping Mercury types to C# types are described in C# data passing conventions.
C# code in a pragma foreign_proc
declaration
for any procedure whose determinism indicates that it can fail
must assign a value of type bool
to the variable SUCCESS_INDICATOR
.
For example:
:- pred string.contains_char(string, character). :- mode string.contains_char(in, in) is semidet. :- pragma foreign_proc("C#", string.contains_char(Str::in, Ch::in), [will_not_call_mercury, promise_pure], " SUCCESS_INDICATOR = (Str.IndexOf(Ch) != -1); ").
C# code for procedures whose determinism indicates that they cannot fail
should not access SUCCESS_INDICATOR
.
Arguments whose mode is input
will have their values set by the Mercury implementation
on entry to the C# code.
If the procedure succeeds,
the C# code must set the values of all output arguments.
If the procedure fails,
the C# code need only set SUCCESS_INDICATOR
to false.