PInvoke из Фортрана в C # - PullRequest
       9

PInvoke из Фортрана в C #

0 голосов
/ 24 ноября 2011

Я хочу импортировать функцию из скомпилированной библиотеки Фортрана. Подпись формы функции, к которой у меня есть доступ, находится в c:

typedef void (__stdcall *fp_SUBLTdllTYPE)(double &,double *,double &,long &,char*,long );

Мой код C # выглядит следующим образом:

//(long &,char*,char*,char*,long &,char*,long ,long ,long ,long );
    [DllImport(@"C:\Program Files\REFPROP\refprop.dll",
        CallingConvention=CallingConvention.StdCall,
        CharSet = CharSet.Auto, 
        EntryPoint = "SETUPdll")
    ]
    public static extern void Setup([In] long nc,[In] 
        [MarshalAs(UnmanagedType.LPStr)] StringBuilder hfiles,
        [In] [MarshalAs(UnmanagedType.LPStr)] StringBuilder hfmix, 
        [In] [MarshalAs(UnmanagedType.LPStr)] StringBuilder hrf, 
        [In,Out] long ierr, [Out] [MarshalAs(UnmanagedType.LPStr)] StringBuilder              herr,long l1, long l2, long l3,long l4);

и определение Фортрана:

subroutine SETUP (nc,hfiles,hfmix,hrf,ierr,herr)
implicit double precision (a-h,o-z)
implicit integer (i-k,m,n)
implicit logical (l)
c
cDEC$ ATTRIBUTES DLLEXPORT :: SETUP
c     dll_export SETUP
c
parameter (ncmax=20)        !max number of components in mixture
parameter (nrefmx=10)       !max number of fluids for transport ECS
parameter (n0=-ncmax-nrefmx,nx=ncmax)
parameter (nrf0=n0)     !lower limit for transport ref fluid arrays
parameter (nrefluids=4) ! numb

проблема в том, что у меня нет доступа к компилятору на Фортране, а мой фортран почти равен нулю.

Когда я вызываю функцию из кода C #:

long ierr=0;
long i = 2;
StringBuilder herr=new StringBuilder("");
Setup(i, new StringBuilder("R410a.mix"), new StringBuilder("hmx.bnc"), new StringBuilder("DEF"), ierr, herr, refpropcharlength * ncmax, refpropcharlength,
            lengthofreference, errormessagelength);

Я получаю следующую ошибку:

Попытка чтения или записи в защищенную память. Это часто признак того, что другая память повреждена.

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 24 ноября 2011

Кажется неправильным передавать объекты StringBuilder, когда вы хотите строку.В качестве отправной точки я бы попробовал что-то вроде передачи herr.ToString () или просто построить Strings для начала вместо StringBuilder (s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...