Фортран DLL в C # дает Невозможно найти ошибку точки входа - PullRequest
0 голосов
/ 10 марта 2019

с просьбой о помощи здесь. Я пытаюсь использовать Fortran DLL в моем приложении C # через Visual Studio 2017 на Windows 10. Я никогда не видел код Fortran в моей жизни. Поэтому я создал образец dll с помощью простой программы, подобной этой, в notepad ++.

subroutine Add(x, y, total)BIND(C,NAME="Add")

!DEC$ ATTRIBUTES DLLEXPORT, ALIAS: 'Add'::Add

integer, intent (in) :: x
integer, intent (in) :: y
integer, intent (inout) :: total   

total = x + y
end subroutine 

Я скомпилировал этот код (1 файл с именем console.f90) в Windows 10, используя компилятор MingW fortran, с помощью следующей команды:

gfortran -c -o C:\Users\Desktop\Temp\console.o C:\Users\Desktop\Temp\console.f90
gfortran -shared -mrtd -o C:\Users\Desktop\Temp\console.dll C:\Users\Desktop\Temp\console.o

Это дало мне console.dll.

Теперь я открыл новый консольный проект C # в VS 2017. Изменил архитектуру на x86 (x64 выдает ошибку неверного формата). Поместите dll fortran (console.dll) в ту же папку, что и мой проект, и включите в проект и установите для свойства значение «Копировать, если новее», чтобы оно копировалось в bin \ debug.

Написал эту строку для P / Invoke

[DllImport("console.dll", EntryPoint = "Add", CallingConvention = CallingConvention.StdCall)]
public static extern void Add([In] int x, [In] int y, [In, Out] int t);

Тогда в моей главной функции использовалась эта

int a = 12;
int b = 30;
int t = 0;
Add(a, b, t);

Хотя, когда я запускаю приложение, в момент выполнения Add (a, b, t) я получаю исключение EntryPointNotFound. Поэтому я использовал DependencyWalker и Dumpbin, чтобы проверить, экспортирована ли функция и правильное ли имя. Результаты ниже:

Экран Dumpbin

Зависимость Уокер

Я вижу, что мои dll x86, а другие x64, это проблема? Также обходчик зависимостей показал 3 dll зависимости 'lib ...'. Я поместил их также в папку проекта и применил то же свойство. Все еще не повезло. Любая помощь ценится здесь. Спасибо

1 Ответ

0 голосов
/ 14 марта 2019

Я установил Выбор платформы на Отладку, которая вызывала проблему. Добавление опции x86 через Configuration Manager и выбор той же самой решило мою проблему.

...