C# 从本机dll调用方法第一次起作用,Instance第二次崩溃(由于fortran模块)?

C# 从本机dll调用方法第一次起作用,Instance第二次崩溃(由于fortran模块)?,c#,fortran,pinvoke,C#,Fortran,Pinvoke,我正在创建一个C#net4.5控制台项目,它使用fortran dll。此dll中的方法在第一次调用时运行良好,在第二次调用时Instacrash,没有任何类型的错误消息 运行一些测试时,我发现如果我不使用module1,这意味着将变量声明放在子例程上,它在任何数量的调用上都可以正常工作 C# FORTRAN !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern subroutine sub(size, myarray) use module1 ! *

我正在创建一个C#net4.5控制台项目,它使用fortran dll。此dll中的方法在第一次调用时运行良好,在第二次调用时Instacrash,没有任何类型的错误消息

运行一些测试时,我发现如果我不使用module1,这意味着将变量声明放在子例程上,它在任何数量的调用上都可以正常工作

C#

FORTRAN

 !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
    use module1   ! * REMOVING MODULE USAGE FIXES THE PROBLEM
  implicit none
INTEGER  :: size
integer :: assignme
REAL, dimension(1:size) :: myarray

assignme = size
allocate(alocarray(1:assignme))

end subroutine
! ************************************begin another file***********
      MODULE module1
      IMPLICIT NONE


real, dimension(:), allocatable :: alocarray
      END MODULE module1
这个解决方案,模块的移除,是非常麻烦的,也是维护上的一大难题,因为我发布的代码问题非常大

环境:GNU Fortran编译器,windows 7 64位,Fortran代码块,VS2012,我没有更改任何编译器选项

有什么想法吗


感谢您抽出时间

您应该在离开子例程之前在子例程中释放数组
allocarray
。由于它是例程中主机关联使用的模块变量,因此在离开子例程后,它将保持分配状态。第二次进入例程时再次尝试分配可能是导致崩溃的原因。或者,您可以通过
allocated()
内在函数检查其分配状态

 !DEC$ ATTRIBUTES DLLEXPORT::ingammaextern
subroutine sub(size, myarray)
    use module1   ! * REMOVING MODULE USAGE FIXES THE PROBLEM
  implicit none
INTEGER  :: size
integer :: assignme
REAL, dimension(1:size) :: myarray

assignme = size
allocate(alocarray(1:assignme))

end subroutine
! ************************************begin another file***********
      MODULE module1
      IMPLICIT NONE


real, dimension(:), allocatable :: alocarray
      END MODULE module1