2011-01-12 6 views
1


Мне была предоставлена ​​рабочая программа FORTRAN, и мне нужно написать C# GUI для нее (не спрашивайте почему). Эта программа уже имеет графический интерфейс FORTRAN, поэтому я выделил все вычислительные подпрограммы и поместил их в dll FORTRAN. Эта dll построена из 4 файлов: одна статическая библиотека, один файл FORTRAN77 (.for) и два файла FORTRAN90 (.f90). Я поместил все подпрограммы, которые должны быть вызваны из кода C# в EXPORT.f90.
FORTRAN КОД:C# не может найти точку входа в dll Fortran

MODULE MYVAR 
    REAL*8 LK 
    COMMON LK 
END MODULE  

SUBROUTINE SETLK(NEWLK) 
    !DEC$ ATTRIBUTES DLLEXPORT :: SETLK 
    USE MYVAR 
    REAL*8 NEWLK 
    LK = NEWLK 
END 

SUBROUTINE GETLK(LKOUT) 
    !DEC$ ATTRIBUTES DLLEXPORT :: GETLK 
    USE MYVAR 
    REAL*8, INTENT(OUT):: LKOUT 
    LKOUT = LK 
END 

Теперь я пытаюсь вызвать их в C#

[DllImport(@"MYDLL.dll", CharSet = CharSet.Ansi, 
CallingConvention = CallingConvention.Cdecl, 
EntryPoint="SETLK")] 
public static extern void SETLK(ref double NEWLK); 

[DllImport(@"MYDLL.dll", CharSet = CharSet.Ansi, 
CallingConvention = CallingConvention.Cdecl, 
EntryPoint="GETLK")] 
public static extern void GETLK(out double LKOUT); 


static void Main(string[] args) 
{ 
    double d1 = 1.234; 
    SETLK(ref d1); 
    double d2; 
    GETLK(out d2); 
    Console.WriteLine(d2.ToString()); 
} 

я получаю EntryPointNotFoundException "не удастся найти точку входа 'SETLK' в 'MyDLL.dll'". Что мне нужно сделать, чтобы он работал?
Thanx

ответ

1

This thread предлагает вам нужен файл .def объявить экспорт функции (так же, как вы привыкли в родном программировании Windows)

+0

спасибо. он работал, но я все еще не могу понять, почему мне приходится писать EXPORT _SETLK @ 4 вместо EXPORT SETLK. если это просто SETLK, я получаю 3 предупреждения: 1. Не могу найти уникальное соответствие для символа «SETLK»; 2. _SETLK определяется в. \ Debug \ EXPORT.obj; 3. _SETLK @ 4, определенный в. \ Debug \ EXPORT.obj; которые приводят к ошибкам –

1

Загляните в вашу dll с помощью инструмента, такого как PE explorer. Он расскажет вам, какие именно функции экспортируются.

+0

ок, Thanx. он не показывает экспортированных функций в моей DLL. поэтому проблема заключается в том, чтобы сделать эти подпрограммы экспортированными –