#c# #visual-studio-2017 #fortran #dllimport
#c# #visual-studio-2017 #fortran #dllimport
Вопрос:
запрашиваю некоторую помощь здесь. Я пытаюсь использовать библиотеку dll fortran в моем приложении 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:UsersDesktopTempconsole.o C:UsersDesktopTempconsole.f90
gfortran -shared -mrtd -o C:UsersDesktopTempconsole.dll C:UsersDesktopTempconsole.o
Это дало мне console.dll.
Теперь я открыл новый консольный проект C # в VS 2017. Изменена архитектура на x86 (x64 выдает ошибку неправильного формата). Разместил библиотеку DLL fortran (console.dll ) в той же папке, что и мой проект, и включен в project, и установите для свойства значение «Копировать, если новее», чтобы оно копировалось в 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, чтобы проверить, экспортирована ли функция и правильно ли указано имя. Результаты ниже:
Я вижу, что мои библиотеки dll являются x86, а другие — x64, это проблема? Также средство управления зависимостями показало 3 зависимости dll ‘lib …’. Я также поместил их в папку проекта и применил то же свойство. По-прежнему безуспешно. Здесь приветствуется любая помощь. Спасибо
Комментарии:
1. Вывод Dependency Walker вводит в заблуждение. Используйте dumpbin, чтобы узнать имя экспорта. Что вы и сделали. И тогда name в порядке. Итак, программа C # явно загружает другую библиотеку DLL.
Ответ №1:
Я установил для выбора платформы значение Debug, которое вызывало проблему. Добавление опции x86 через Configuration manager и выбор той же самой исправили мою проблему.