4

dllに関数をロードしようとしています。dllが読み込まれましたが、関数を呼び出した場所で例外が発生します

あいまいな一致が見つかりました

これがコードスニペットです。

Assembly dll = Assembly.LoadFrom(DLLPATH);
if (dll != null)
{
    Type Tp = dll.GetType("ABCD.FooClass");
    if (Tp != null)
    {
        Object obj = Activator.CreateInstance(Tp);

        if (obj != null)
        {                            
            List = (List<String>)obj.GetType().GetMethod("Foo").Invoke(obj, null);
        }
        else
        {
            Console.WriteLine("obj is null");
        }
    }
    Console.WriteLine("Type is null");
}
else
    Console.WriteLine("Dll is not loaded");

Console.ReadKey();

私が呼び出しているメソッド(つまりFoo)は、パラメーターを受け入れず、オーバーロードされたメソッドです。それは私が間違っている場所ですか、それとも他の場所ですか?

パラメータを受け入れないそのようなメソッドを呼び出す別の方法はありますか?ここに掲載されている解決策を試しましたが、機能していません。

4

4 に答える 4

8

Type.GetMethod(string methodName)指定された名前のメソッドが複数ある場合、メソッドは前述の例外をスローします (この MSDN トピックを参照しください)。あなたが言うようにオーバーロードであるため、同じDLLにFoo複数のメソッドがあると思われます。Fooたとえば、メソッドがある場合:

IList<string> Foo()

IList<string> Foo(object someParameter)

メソッドGetMethod(string methodName)は、どちらが必要かを判断できません。この場合、メソッドを使用しGetMethodsて、自分で正しいメソッドを決定する必要があります。

于 2013-03-06T08:27:00.407 に答える
3

助けてくれてありがとう。

私が言ったように、私が呼び出していたメソッド (つまり FOO) はオーバーロードされています。GetMethod() を適切に使用していないと思います。今、 GetMethods() 関数を使用して解決策を見つけました。

次のようにコードを変更したところ、うまくいきました.!!

Assembly dll = Assembly.LoadFrom(DLLPATH);
if (dll != null)
{
   Type Tp = dll.GetType("ABCD.FooClass");
   if (Tp != null)
   {
      Object obj = Activator.CreateInstance(Tp);
      if (obj != null)
      {                            
         MethodInfo[] AllMethods = obj.GetType().GetMethods();
         MethodInfo Found = AllMethods.FirstOrDefault(mi => mi.Name == "Foo" && mi.GetParameters().Count() == 0);
         if (Found != null)
             List = (List<String>)Found.Invoke(obj, null);           
      }
      else
        Console.WriteLine("obj is null");       
   }
    else
     Console.WriteLine("Type is null");
 }
  else
     Console.WriteLine("Dll is not loaded");
于 2013-03-06T10:11:35.113 に答える
0

ありがとう。

私の「あいまいな一致が見つかりました」は、ASCX(フロントエンド)にBioという名前のテキストボックスがあり、リストビュー<%# DataBinder.Eval(Container.DataItem, "Bio")%>にBioという名前のデータ要素があり、文字列に名前を付けたことです.CS の変数 Bio。

ビルド エラーや「レッドライン」はありませんが、実行時にエラーが発生しました。変数の名前を別の名前に変更したところ、エラーはなくなりました。コードを書いたプログラマーは、BioTxt などの命名規則に従っていませんでした。これにより、エラーが解消されます。

于 2016-04-11T19:01:30.600 に答える