-1

我想从 C# PInvoke 用 VB6 编写的函数。我们可以像这样在VB6中调用这个函数:

Declare Function ApplyNNet Lib " location of the DLL file" (MyNNetType As String, MyAddress As String, MyInput() As Double) As Variant

我在 C# 中的代码是:

[DllImport("NNetApply.dll", EntryPoint = "ApplyNNet", CallingConvention = CallingConvention.StdCall)] 
public static extern IntPtr ApplyNNet(string type, string add, double[,] data);
//run ANN with data
string address = @"C:\Users\PNGE-User\Desktop\Faegheh\Project\Neural Network For Pressure Vs q,x,y\P ve x,y,q\P ve x,y,q";
        double[,] P = new double[no_data,2];
        var P_ = ApplyNNet("Back Prop", address, data);

当我调试我的代码时,会出现一个错误:

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

4

1 回答 1

6

首先,我假设 DLL 实际上不是用 VB6 编写的。Declare您显示用于调用该函数的代码的事实与此相矛盾。所以我假设 DLL 是用其他语言(例如 C++)编写的,并且您当前正在从 VB6 调用 DLL。

调用 DLL 的 VB6 代码声明如下:

Declare Function ApplyNNet Lib "DLLFileName" (MyNNetType As String,
    MyAddress As String, MyInput() As Double) As Variant

您的 C# 版本如下所示:

[DllImport("NNetApply.dll", EntryPoint = "ApplyNNet", 
    CallingConvention = CallingConvention.StdCall)] 
public static extern IntPtr ApplyNNet(string type, string add, double[,] data);

有两个明显的区别:

  1. 第三个参数不匹配。而不是double[,]你需要double[].
  2. 返回值不匹配。VB6 变体无法与IntPtr. 您需要在 C# 代码中将返回值声明为类型object

所以pinvoke应该是:

[DllImport("NNetApply.dll")] 
public static extern object ApplyNNet(string type, string add, double[] data);

更新

使用此声明,您会收到 pinvoke 错误:

PInvoke 限制:不能返回变体。

我不确定您如何在 pinvoke 中解决此问题。在您的情况下,我想我会创建一个 VB6 项目来包装 DLL 并将其公开为 COM 接口。然后,我将向您的 C# 项目添加 COM 引用并继续。

于 2013-01-28T16:32:16.563 回答