-1

C# から VB6 で記述された関数を PInvoke したい。この関数は、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);

明らかな違いが 2 つあります。

  1. 3 番目のパラメーターが一致しません。double[,]あなたが必要とする代わりにdouble[]
  2. 戻り値が一致しません。VB6 バリアントを と照合することはできませんIntPtrobjectC# コードで、戻り値が型であることを宣言する必要があります。

したがって、ピンボークは次のようになります。

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

アップデート

この宣言を使用すると、pinvoke エラーが発生します。

PInvoke の制限: バリアントを返すことはできません。

pinvoke でこれを回避する方法がわかりません。あなたの状況では、DLL をラップして COM インターフェイスとして公開する VB6 プロジェクトを作成すると思います。次に、C# プロジェクトに COM 参照を追加して、先に進みます。

于 2013-01-28T16:32:16.563 に答える