2011-11-24 82 views
0

我想從一個Fortran編譯庫導入函數的函數形式的簽名,我有機會在C:的PInvoke從FORTRAN語言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); 

和FORTRAN定義是:

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 

的問題是,我沒有獲得一個Fortran組合物1勒勒和我的fortran幾乎是零。

當我打電話從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); 

我得到以下錯誤:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

誰能幫助我?

+0

我不知道Fortran中的字符串。但是,你的整數是錯誤的。在Windows上的C中,「long」是32位。在C#中使用'int'來匹配它。 –

回答

0

當你想要一個字符串時,傳遞StringBuilder對象似乎是不正確的。作爲一個起點,我會嘗試傳遞herr.ToString()或者只是構建字符串而不是StringBuilder(s)。

+0

我也試過用字符串也沒有解決。我收到另一個錯誤:對PInvoke函數「RefPropTestNet!ConsoleApplication1.Program :: Setup」的調用使堆棧不平衡。這很可能是因爲託管的PInvoke簽名與非託管目標籤名不匹配。檢查PInvoke簽名的調用約定和參數是否與目標非託管簽名相匹配。 VladM