2010-03-04 7 views
1

C#에서 fortran 서브 루틴을 호출합니다. 나는에 전달할 수있는 매개 변수 중 하나는 매개 변수가마샬링해야 할 것은 무엇입니까?

지금
character, intent(in) :: bmat*1 

문제이며, C# 코드에서, 내가 무엇으로 마샬링해야 선언되는 포트란에서, 문자 .i.e입니까? integer에 대해서는 [MarshalAs(UnmanagedType.I4)]으로 마샬링해야하지만, character은 어떨까요?

편집 :이 내 포트란 코드 :

subroutine chartest(bmat) 
    !DEC$ ATTRIBUTES DLLEXPORT::chartest 
    !DEC$ ATTRIBUTES ALIAS:'chartest'::chartest 
    !DEC$ ATTRIBUTES VALUE ::bmat 
    character, intent(in) :: bmat*1 
    if(bmat .eq. 'G')then 
     print *, bmat 
    else 
     print *, ' no result ' 
    endif 
    end 

그리고 이것은 내 상호 운용성 코드 :이 내가 루틴을 호출하는 방법입니다

[DllImport(@"eigensolver_win32.dll")] 
    public static extern void chartest([MarshalAs(UnmanagedType.U1)] char bmat); 

:

char bmat = 'G'; 
    EigenSolver32.chartest(bmat); 

내가 얻은 결과는 "결과가 없음"이며, 이는 if i 성취되지 않았습니다.

+0

그래서 무엇이 당신을 위해 일하게 되었습니까? –

+0

@ 존, 대답은 작동합니다 – Graviton

+0

'ref 바이트 '를 사용해야합니까? –

답변

2

FORTRAN의 character 유형은 부호없는 8 비트 수량입니다.

[MarshalAs(UnmanagedType.U1)] 

사용할 수 있습니다.

표준이 아닌 FORTRAN byte 유형이 서명되었습니다. UnmanagedType.I1

편집 : C# char 유형은 유니 코드 (16 비트) 유형입니다. C# byte 형식은 FORTRAN 문자 형식과 일치하는 형식입니다.

[DllImport(@"eigensolver_win32.dll")] 
public static extern void chartest([MarshalAs(UnmanagedType.U1)] byte bmat); 

올바르게 기억한다면 모든 FORTRAN 함수 인수가 참조로 전달되므로 대신이 매개 변수가 필요할 수 있습니다.

[DllImport(@"eigensolver_win32.dll")] 
public static extern void chartest([MarshalAs(UnmanagedType.U1)] ref byte bmat); 

그리고 저는 [MarshalAs(UnmanagedType.U1)]이 바이트로 중복되어 있다고 생각합니다.

+0

감사합니다. 하지만'if '('if (bmat .eq.'G ')') 명령을 사용하여 포트란 프로그램의'bmat'을 검사 할 때 false를 반환했습니다. 내가 잘못 한게있어? – Graviton

+0

C# 코드를 비롯한 더 많은 코드가 필요합니다. –

+0

그리고'print *, bmat'을하면'G'가 되겠습니다. 정말 이상합니다. – Graviton

관련 문제