在我目前的工作中,一项主要任务是采用现有的工程工具,并对其进行更新,因为它已停止使用现代操作系统。
现在该工具是用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
没有任何变化。