2017-03-19 12 views
2

asp.netアプリケーションからdll(vb6で書かれています)を呼び出しています。私は、DLLの次の関数を呼び出しています:最適なオーバーロードされたメソッドと一致する...無効な引数がいくつかあります[byref/byval]

​​

C#で次のコードは、上記の関数を呼び出します:

public Boolean VerifyFinger(String name , String SampleModel, String REMOTE_ADDR) 
     { 

      try 
      { 
       Connect(); 
       OracleCommand command = connection.CreateCommand(); 
       string sql = "SELECT FINGER_DATA,DATA_LENGTH,SERIAL_NO FROM FP_BIOMETRIC_DATA WHERE CUST_NO =" + name.Trim(); 
       command.CommandText = sql; 
       OracleDataReader reader = command.ExecuteReader(); 

       bool fingerMatched = false; 
       FamServer.FamApp famApp = new FamServer.FamApp(); 
       while (reader.Read()) 
       { 
        Object[] values = new object[3]; 
        int numColumns = reader.GetValues(values); 
        byte[] fingerData = values[0] as byte[]; 
        string result = System.Text.Encoding.UTF8.GetString(fingerData); 

        int length_of_data = Convert.ToInt32(values[1]); 
        int serial_no = Convert.ToInt32(values[2]); 

        //      FamIdentify_BYTE(ref string, ref object, ref int, ref string, ref string) 
        fingerMatched = famApp.FamIdentify_BYTE(name, fingerData, length_of_data, SampleModel, REMOTE_ADDR); 

       //  if (fingerMatched) 
         // break; 
       } 
       famApp.Termination(); 
       // famApp = null; 
       GC.Collect(); 

       Close(); 
       return fingerMatched; 
      } 
      catch (Exception e) 
      { 
       HttpContext.Current.Response.Write("<br>" + e.GetBaseException() + "<br>"); 
       return false; 
      } 
     } 

をしかし、私はIIS Expressでアプリケーションを実行すると、私はこのエラーを取得しています:

The best overloaded method match for 'FamServer._FamApp.FamIdentify_BYTE(ref string, ref object, ref int, ref string, ref string)' 
has some invalid arguments ASPNET(1) 

これは完全なエラーのリストです:

F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,37): error CS1502: The best overloaded method match for 'FamServer._FamApp.FamIdentify_BYTE(ref string, ref object, ref int, ref string, ref string)' has some invalid arguments 
F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,61): error CS1620: Argument '1' must be passed with the 'ref' keyword 
F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,67): error CS1503: Argument '2': cannot convert from 'byte[]' to 'ref object' 
F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,79): error CS1620: Argument '3' must be passed with the 'ref' keyword 
F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,95): error CS1620: Argument '4' must be passed with the 'ref' keyword 
F:\ASP.NET Projects\ASPNET\App_Code\Global.asax.cs(180,108): error CS1620: Argument '5' must be passed with the 'ref' keyword 

IISサーバーで上記のアプリケーションを実行すると、リダイレクトの時間が長すぎます。なぜこのことが起こっているのか理解できません。私を助けてください 。

+0

引数1、3、4、5のためのエラーは明白である: 'REF' キーワードを使用します関数を呼び出すとき。現時点では、第2パラメータについてはわかりません – nabuchodonossor

答えて

2

MSDN Libraryからパラメータメカニズムを渡しに関する若干の落とし穴:Visual Basic 6.0ので

、あなたは ・プロシージャのパラメータ、ByRefのに受け渡しメカニズムのデフォルトのためのByValまたはByRefの指定しない場合。この は、呼び出しプログラム でプロシージャに渡された変数を変更できるようにします。

上記の説明を使用して、DLLライブラリメソッドは、デフォルトですべての入力変数に対して参照渡しを使用します。これは、C#のデフォルト(パスバイバリュー)では動作が異なります。したがって、refキーワードは、このようなメソッド呼び出し内のすべての渡された変数のために必須である。この時点で

fingerMatched = famApp.FamIdentify_BYTE(ref name, ref fingerData, ref length_of_data, ref SampleModel, ref REMOTE_ADDR); 

、それは細かい作業が、まだobjectにバイト配列から無効なキャストが含まれている第二の問題(VBでVariantを持っているようです入力パラメータを渡している間に(図6)。あなたが最初のobjectにそのバイト配列を変換する必要があります。

fingerMatched = famApp.FamIdentify_BYTE(ref name, ref fingerObject, ref length_of_data, ref SampleModel, ref REMOTE_ADDR); 

NB:次に

byte[] fingerData = values[0] as byte[]; 

// Variant in VB 6 translated as Object into C# 
// Therefore, a conversion to Object type is required 
object fingerObject = fingerData; 

、上記のメソッド呼び出しは、このように変更する必要がありますが型に参照パラメータを持つメソッドを呼び出すことはできません正確には指定されたパラメータタイプ以外であり、refパラメータには任意の割り当て可能な値を含める必要があります。

関連参照:

Passing Objects By Reference or Value in C#

Why use the 'ref' keyword when passing an object?

Passing Parameters (MSDN Library)

Cannot convert from 'ref byte[]' to 'ref object'

関連する問題