вызов С# из Фортрана

Я не нашел на Stack Overflow сообщений, в которых обсуждается вызов C# из Fortran (я также использую Visual Studio 2010 с установленным Intel Visual Fortran). Однако существует (очень) ограниченное количество сообщений[1 , 2, 3], в которых обсуждается вызов C/C++ из фортран.

В одном из ответов на эти сообщения было высказано предположение, что вызов C++ из Fortran сложнее, чем вызов C, что вызвало у меня подозрения, что C# может быть еще сложнее? Не имея основ в C/C++/C#, мне интересно, применимы ли процедуры, изложенные для C/C++, к C#?

Одна общая черта, которую я заметил в этих сообщениях, заключалась в том, что необходим встроенный модуль с именем ISO_C_BINDING. Прочитав немного больше об этом здесь, я не понял, что ISO_C_BINDING позволит мне передать пару 2D-массивов информации в программу (скомпилированную как DLL), написанную на C#, вызвать некоторые «события» (аналогично функциям?) и, наконец, получить 2D-массив информации из C#, прежде чем перейти к моим делам на Фортране.

Если вы знакомы как с Fortran, так и с C#, не могли бы вы сказать мне, подходит ли ISO_C_BINDING для этой задачи? Я не получил этого смысла из информации, которую я перечислил выше. Если у кого-нибудь есть рабочий пример, включающий передачу массивов между C# и Fortran, а также вызов функций C# из Fortran, я был бы очень признателен за возможность просмотреть его в качестве шаблона того, как я мог бы действовать. Спасибо, Эрик


person user2256085    schedule 08.04.2013    source источник
comment
Вы можете обернуть свой код Fortran клеем C. Затем ваш код C# вызовет код C, который вызовет ваш Fortran   -  person Basile Starynkevitch    schedule 08.04.2013
comment
Привет, пользователь 2256085, я задаю точно такой же вопрос и, как и вы, не могу найти много информации об этом. Когда я нахожу что-то, например ответ ниже, мне часто кажется, что это неправильное направление, то есть с Фортрана на С#, а не наоборот. Узнали ли вы что-нибудь новое за 2 года, прошедшие с момента публикации этого поста?   -  person u8it    schedule 28.09.2015
comment
P57, в конце концов я смог заставить работать пример. Если есть способ продолжить этот разговор напрямую (по электронной почте), давайте сделаем это, хотя для этого может потребоваться, чтобы один из нас разместил здесь прямую контактную информацию, чего вы, возможно, не захотите делать (я не хочу).   -  person user2256085    schedule 30.09.2015


Ответы (1)


Код на Фортране:

function TestPass (floatArray) result (iRes)
implicit none
dll_export :: TestPass ! export function name

integer :: Ires
real, intent (in out) :: floatArray

dimension floatArray(5)

iRes = 0 ! Assign function result

open (5,FILE='output.txt')
write (5, 100) floatArray(3)

floatArray(0) = 0.0
floatArray(1) = 1.1
floatArray(2) = 2.2
floatArray(3) = 3.3
floatArray(4) = 4.4

! correct values are written to file here...
open (5,FILE='output.txt')
write (5, 100) floatArray(3)
100 format(5X,'got here',5X,F3.3)
close (5)
end function

Код C#:

static extern int TestPass (
[MarshalAs(UnmanagedType.LPArray, SizeConst=5,
ArraySubType=UnmanagedType.R4)]
float [] yields);

private void BtnTestClick(object sender, System.EventArgs e)
{
float [] floatArray = new float[5] {9.9F, 9.9F, 9.9F, 9.9F, 9.9F};
TestPass(floatArray);

// floatArray.Length == 0 after the function call

for ( int i = 0; i < floatArray.Length; i++ )
Trace.WriteLine(floatArray[i]);
}

Также перейдите по этой ссылке:

http://software.intel.com/en-us/articles/calling-fortran-function-or-subroutine-in-dll-from-c-code

Вы также можете обратиться к теории по этому поводу:

http://www.ibiblio.org/pub/languages/fortran/ch2-4.html

person Freelancer    schedule 08.04.2013
comment
Привет, фрилансер, Боже, мне пришлось вернуться и перечитать свой первоначальный пост, потому что приведенный вами пример заставил меня подумать, что я спросил прямо противоположное тому, что намеревался. Если я не пропустил очевидное, что вполне возможно, я просил привести пример, в котором C# вызывается из Fortran. То есть, есть ли у вас (или у кого-либо еще в этом отношении) пример кода на Фортране, в котором используется функция, написанная на C#, а не наоборот, как показано выше? - person user2256085; 09.04.2013