将Fortran DLL转换为VB.NET DLL

将Fortran DLL转换为VB.NET DLL,vb.net,dll,fortran,fortran77,Vb.net,Dll,Fortran,Fortran77,核心问题:如果我不能从调用程序更改调用过程,我还能将DLL的原始源代码从Fortran 77翻译成VB.Net吗?也就是说,是否有可能使用VB.NET编写的DLL的行为与其源代码最初用Fortran 77编写的DLL相同 我知道我会遇到字符串的问题。但我的任何过程都不会有字符串的输入/输出,只有4字节整数和8字节双精度 我必须修改最初用Fortran 77编写的DLL。为了使将来的更改更容易,我想将DLL源代码从Fortran翻译成VB.Net。我不能修改调用DLL的程序,而且我没有调用DLL的

核心问题:如果我不能从调用程序更改调用过程,我还能将DLL的原始源代码从Fortran 77翻译成VB.Net吗?也就是说,是否有可能使用VB.NET编写的DLL的行为与其源代码最初用Fortran 77编写的DLL相同

我知道我会遇到字符串的问题。但我的任何过程都不会有字符串的输入/输出,只有4字节整数和8字节双精度

我必须修改最初用Fortran 77编写的DLL。为了使将来的更改更容易,我想将DLL源代码从Fortran翻译成VB.Net。我不能修改调用DLL的程序,而且我没有调用DLL的程序的代码,所以我不知道它是如何调用的。首先,我想做的是可能的吗?我认为这是因为DLL是一个DLL,不管源语言是什么,不是吗?这就是我所处的位置:

Fortran源代码如下所示:

    subroutine init(dwid)

    use dfport
    implicit none
    common /fltcmn/ ifirst, icnt
    integer ifirst, icnt
    integer(4) dwid
    external fndndx
cDEC$ ATTRIBUTES C, REFERENCE, DLLEXPORT, ALIAS:'_INIT' :: INIT

    [code in here w/ return]

    end subroutine init


    function fndndx(dwid)

    use dfport
    implicit none
    common /fltcmn/ ifirst, icnt
    integer ifirst, icnt, fndndx
    integer(4) dwid

    [code in here w/ return]

    end function fndndx
现在我尝试翻译它(现在它不起作用)


我非常确信[code in here w/return]是正确的,因为它是基本的逻辑语句。然而,我不确定的是,我是否正确地处理Fortran“common”语句,以及是否可以将函数和子例程放在“Class”中……我认为答案是“你不能这样做”。据我所知,你显示的DLL是通过更改公共块中的变量将信息返回主程序。但是.NET没有这个功能。

你说的是“让未来的更改更容易”。但哪一个更有可能有未来,并且更广泛?Fortran还是VB?VB出生于1991年。Fortran成功地生存了40多年,是一个积极改进的标准(Fortran 66、77、90、95、2003、2008和即将到来的2015年),有许多编译器可以依靠,而不仅仅是一个,还有很好的免费编译器(gfortran、open64)。。。哦,顺便说一下,如果它是一个DLL,它也可以链接到VB以及其他任何东西,不需要太多的翻译。你是说这是原始的FORTRAN源代码,“[Code in here w/return]”编译并实际执行某些操作吗?好。。。自从上次我用FORTRAN编写代码以来已经有一段时间了,但我的印象是,这段代码没有任何作用。关于课程,这根本不是交易;它们仅仅是容器,在最坏的情况下,您只需将其包含在您的通话中即可。完全相同,恐怕这是不可能的。使用VB.NET,您可以考虑所有的.NET框架(FORTRAN没有)。通过寻找从语言Y调用语言X中构建的DLL的方法,您可以进行快速研究;总是有不同的零碎。在处理.NET时,必须支持.NET。另一方面,它不需要完全相同,因为调用程序可能同时支持这两者(并且您可能会想出一种方法来补偿差异)。但是无法访问调用程序的源代码肯定是个问题。您可以尝试使用Silverfrost编译器之类的东西构建F77代码,该编译器具有.net接口,并使用它生成的dll。请查看。这适用于VB6中使用的VB.net DLL。这将类似于在其他语言中使用DLL。
    Public Class Class1
        Public ifirst as Integer
        Public icnt as Integer

        Sub init(ByVal dwid as Integer)

            [Code in here w/ return]

        End Sub

        Function fndndx(ByVal dwid as Integer) as Integer

            [Code in here w/ return]

        End Function

    End Class