将FORTRAN DLLIMPORT翻译为C ++ / C#

时间:2015-06-17 07:12:21

标签: c# fortran dllimport

在我目前的工作中,一项主要任务是采用现有的工程工具,并对其进行更新,因为它已停止使用现代操作系统。

现在该工具是用FORTRAN编写的,大多数源文件头都是这样的:

C    modified by (obfuscated) at dd. mm. 19yy to do something

从那时起,员工们一直在循环,大部分文档要么从未完成,要么已经丢失。因此,我们可以解读程序的运作方式,然后以更现代的语言重新创建该功能。

为此,我们选择了C#。

我有点能阅读FORTRAN,所以破译数学,逻辑到目前为止一直很直接,但是当我来到dllimports时我会被困住。

我不知道是谁创建了dll,或者源代码在哪里,但我确定的是他们负责某些供应商组件的一些关键计算。因此,我不能简单地用新代码替换dll,因为我不知道哪个方程式在那里..

我发现旧程序将xml格式的数据发送到dll条目,并得到一个类似xml的字符串。然而,我不能复制它,因为我不完全确定它是如何工作的。

任何人都可以解释一下,或者甚至可以将其转换为C ++ / C#等价物吗?

  ! interface for CalculateStuff.dll
  INTERFACE
    SUBROUTINE CalculateComponent(Input, Output)
      !DEC$ ATTRIBUTES REFERENCE, ALIAS : '_CC@16' :: CalculateComponent
      !DEC$ ATTRIBUTES DLLIMPORT :: CalculateStuff
      CHARACTER*(*) Input, Output
      !DEC$ ATTRIBUTES REFERENCE :: Input
      !DEC$ ATTRIBUTES REFERENCE :: Output
    END SUBROUTINE
  END INTERFACE

目前我有这个片段(C#),但它似乎对我失败了:

class CalculateStuff{
    [DllImport("CalculateStuff.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall, EntryPoint = "_CC@16")]
    public static extern void CalculateComponent(ref string input, ref string output);
}

编辑1:添加了charset 现在程序给了我这个例外,我认为这是一个改进:

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

编辑2:重新编译为32位应用程序,现在我得到:

External component has thrown an exception.

编辑3:将返回类型更改为void,因为这对我来说非常有意义。

编辑4:添加了定义为stdCall的调用约定,由于许多评论暗示,它没有帮助。 我们也尝试将参数类型定义为string,或ref string没有任何变化。

0 个答案:

没有答案