Библиотека dll Fortran в C # выдает неспособность найти ошибку точки входа

#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 и выбор той же самой исправили мою проблему.