Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将vba importdll代码转换为c#_C#_Vba_Marshalling_Dllimport_Fatal Error - Fatal编程技术网

将vba importdll代码转换为c#

将vba importdll代码转换为c#,c#,vba,marshalling,dllimport,fatal-error,C#,Vba,Marshalling,Dllimport,Fatal Error,我有一个导入dll的vba代码。 代码如下: Declare PtrSafe Function g77alscal Lib "g77alscal.dll" _ Alias "g77alscal_" _ (ByRef Nrows As Long, _ ByRef Ncols As Long, _ ByRef Xinput As Single, _ ByRef MDSout As Single, _ ByRef Metric As Single, _ ByRef Sout As Single, _

我有一个导入dll的vba代码。 代码如下:

Declare PtrSafe Function g77alscal Lib "g77alscal.dll" _
Alias "g77alscal_" _
(ByRef Nrows As Long, _
ByRef Ncols As Long, _
ByRef Xinput As Single, _
ByRef MDSout As Single, _
ByRef Metric As Single, _
ByRef Sout As Single, _
ByRef Niter As Long, _
ByRef Xdebug As Single, _
ByRef Idebug As Long) As Long
vba中的调用是

Dim Distance() As Single
Dim MDSout() As Single
Dim Metric(60) As Single
Dim Sout(2) As Single
Dim Niter As Long
Dim Xdebug(5000) As Single
Dim Idebug(30) As Long
Dim ierr As Long

N = CLng(Ncases)


ierr = g77alscal(N, N, Distance(1, 1), MDSout(1, 1), Metric(1), _
                 Sout(1), Niter, Xdebug(1), Idebug(1))
在c#中,我尝试使用:

[DllImport("g77alscal.dll",EntryPoint="g77alscal_")]
static extern double g77alscal(ref long nRows, 
        ref long nCols,
        ref double xInput,
        ref double mdsOut,
        ref double metric,
        ref double sOut,
        ref long nIter,
        ref double xDebug,
        ref long iDebug
    );
对c#函数的调用是:

long n1 = Distance.Rows.Count;
long n2 = Distance.Columns.Count;
double n3 = double.Parse(Distance.Rows[0].ItemArray[0].ToString());
double n4 = 0;
double n5 = 0;
double n6 = 0;
double n7 = 0;
long n8 = 0;

double result = g77alscal(ref n1, ref n2, ref  n3,
    ref n4, ref n5, ref n6, ref nIter, ref n7, ref n8);
代码传递了编译器错误,但有一个运行时错误(FatalExecutionEngineError异常)。 错误是:

运行时遇到致命错误。错误的地址 位于0x73c36e93,线程0x13a0上。错误代码为0xc0000005。 此错误可能是CLR或不安全或不可验证文件中的错误 部分用户代码。此错误的常见来源包括用户 COM互操作或PInvoke的封送处理错误,这可能会损坏 堆叠

我还没有找到dll的文档,所以除了fortran77编译代码之外,我不能对dll说太多。它是用于spss的alscal函数的一个实现

我对c#中的定义有什么错误吗? 任何帮助或指点都会非常有用

谢谢

更新: 我已尝试将c#的代码更改为如下所示:

电话:

int n1 = 21;
int n2 = 21;
float n3 = float.Parse(Distance.Rows[0].ItemArray[0].ToString());
float n4 = 0;
float n5 = 0;
float n6 = 0;
float n7 = 0;
int n8 = 0;

int result = g77alscal(ref n1, ref n2, ref  n3,
    ref n4, ref n5, ref n6, ref nIter, ref n7, ref n8);
此外,我还发现了另一种模式,每当我在代码处使用断点运行应用程序时,就会抛出上面的错误异常,但当我不进行调试时,就会抛出一个
AccessViolationException

您最初的“vba版本”使用类型
Single
传递一些参数,它应该是一个4字节的浮点数。它在C中是等价的,应该是
float

您在代码中使用的是
double
,它是一个8字节的浮点数。这在函数尝试清理堆栈并返回时会导致问题

整数类型似乎也有同样的问题,其中vba中的
Long
是4字节,而C#的
Long
是8字节。您应该改用
int

尝试将
double
更改为
float
并将
long
更改为
int

您的原始“vba版本”使用类型
Single
来传递一些参数,这些参数应为4字节浮点数。它在C中是等价的,应该是
float

您在代码中使用的是
double
,它是一个8字节的浮点数。这在函数尝试清理堆栈并返回时会导致问题

整数类型似乎也有同样的问题,其中vba中的
Long
是4字节,而C#的
Long
是8字节。您应该改用
int


尝试将
double
更改为
float
并将
long
更改为
int

经过更多测试后,准确的错误再次出现。如果不是,那么将出现accessviolationexception。还有什么想法吗?@SyakurRahman你确定这是个例外吗?也许它不是同一段代码?同样,在vba中long是一个4字节的int,在c#中是一个8字节的int,我相信是的,它是同一段代码。我尝试逐语句跟踪,以确保准确的行触发了异常。写的错误与我上面发布的完全相同,地址和错误代码不同。我的意思是编辑您的问题,以显示更新的代码,该代码在c#中定义并调用dll,以反映您所做的更改。经过更多测试后,准确的错误再次出现。如果不是,那么将出现accessviolationexception。还有什么想法吗?@SyakurRahman你确定这是个例外吗?也许它不是同一段代码?同样,在vba中long是一个4字节的int,在c#中是一个8字节的int,我相信是的,它是同一段代码。我尝试逐语句跟踪,以确保准确的行触发了异常。写的错误与我上面发布的地址和错误代码完全相同。我的意思是编辑您的问题以显示更新的代码,这些代码定义并调用了c#中的dll,以反映您所做的更改。
int n1 = 21;
int n2 = 21;
float n3 = float.Parse(Distance.Rows[0].ItemArray[0].ToString());
float n4 = 0;
float n5 = 0;
float n6 = 0;
float n7 = 0;
int n8 = 0;

int result = g77alscal(ref n1, ref n2, ref  n3,
    ref n4, ref n5, ref n6, ref nIter, ref n7, ref n8);