I am calling a fortran subroutine from C#. One of the parameter I have to pass in is character .i.e, in fortran that parameter is declared as
character, intent(in) :: bmat*1
The issue now is, in C# code, what should I marshaled it as? I know that for integer, I should marshal it as [MarshalAs(UnmanagedType.I4)], but what about character?
Edit: This is my fortran code:
subroutine chartest(bmat)
!DEC$ ATTRIBUTES DLLEXPORT::chartest
!DEC$ ATTRIBUTES ALIAS:'chartest'::chartest
!DEC$ ATTRIBUTES VALUE ::bmat
character, intent(in) :: bmat*1
if(bmat .eq. 'G')then
print *, bmat
else
print *, ' no result '
endif
end
And this is my interop code:
[DllImport(@"eigensolver_win32.dll")]
public static extern void chartest( [MarshalAs(UnmanagedType.U1)] char bmat);
This is how I call the routine:
char bmat = 'G';
EigenSolver32.chartest(bmat);
The result I got was “no result”, indicating that the if is not fulfilled.
The
charactertype in FORTRAN is an unsigned 8 bit quantity.Will work.
The non-standard FORTRAN
bytetype is signed. it would beUnmanagedType.I1Edit: C# char type is a Unicode (16 bit) type. The C#
bytetype is the one that matches the FORTRAN character type.Also, if I remember correctly all FORTRAN function arguments are passed by reference, so you may need this instead.
And I think that
[MarshalAs(UnmanagedType.U1)]is redundant for byte.