C# 未处理MissingMethodException

C# 未处理MissingMethodException,c#,reflection,missingmethodexception,C#,Reflection,Missingmethodexception,我正在通过反射创建一个程序集。当我尝试运行我的应用程序时,我在以下位置得到一个MissingMethodExection: // public static bool berekenQueens(int Row, int N, bool[,] bord) objType.InvokeMember("berekenQueens", BindingFlags.InvokeMethod | BindingFlags.Instance | Bind

我正在通过反射创建一个程序集。当我尝试运行我的应用程序时,我在以下位置得到一个MissingMethodExection:

        // public static bool berekenQueens(int Row, int N, bool[,] bord)
        objType.InvokeMember("berekenQueens",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static,
            null, instance, null);

        // private static bool bordValidatie(int currentRow, int currentCol, bool[,] currentBord, int N)
        objType.InvokeMember("bordValidatie",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static,
            null, instance, null);     
我的代码单击菜单项时,我想创建一个程序集并加载类

    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        // Create an assembly object to load our classes
        string path = System.Environment.CurrentDirectory + "\\NQueens.dll";
        Assembly ass = Assembly.LoadFile(path);
        Console.WriteLine(path);

        Type objType = ass.GetType("NQueens.NQueen");

        // Create an instace of NQueens.NQueen
        var instance = Activator.CreateInstance(objType);

        // public static bool berekenQueens(int Row, int N, bool[,] bord)
        objType.InvokeMember("berekenQueens",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static,
            null, instance, null);

        // private static bool bordValidatie(int currentRow, int currentCol, bool[,] currentBord, int N)
        objType.InvokeMember("bordValidatie",
            BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Static,
            null, instance, null);     
    }
我要加载的方法来自我的项目nqueen

public class NQueen
{
public static bool berekenQueens(int Row, int N, bool[,] bord)
{
   if (Row >= N) return true; 
   for (int Col = 0; Col < N; Col++)
   {
       //Q toevoegen
       bord[Row, Col] = true;
       //Q + Q volgende Row  controleren
       if (bordValidatie(Row, Col, bord, N) && berekenQueens(Row + 1, N, bord))
       {
           return true;
       }
       //Q verwijderen indien niet door controle
       bord[Row, Col] = false;
   }
   return false;
}


private static bool bordValidatie(int currentRow, int currentCol, bool[,] currentBord, int N)
{
   int colstep = 1;
   for (int i = currentRow - 1; i >= 0; i--)
   {
       //rechte lijn 
       if (currentBord[i, currentCol])
           return false;
       //linker diagonaal
       if (currentCol - colstep >= 0)
       {
           if (currentBord[i, currentCol - colstep])
               return false;
       }
       //rechter diagonaal
       if (currentCol + colstep < N)
       {
           if (currentBord[i, currentCol + colstep])
               return false;
       }
       colstep += 1;
   }
   return true;
}
}

有人能帮我吗?

使用BindingFlags.NonPublic代替BindingFlags。方法bordValidatie的实例作为私有方法。

使用BindingFlags.NonPublic代替BindingFlags。方法bordValidatie的实例作为私有方法。

绑定器也使用参数来找到合适的方法。您没有方法void berekenQueens,因此使用null作为最后一个参数调用InvokeMember。arguments数组不会给出匹配的方法。您实际上不需要该实例,因为该方法是静态的,所以如果愿意,可以将其保留为null

      Type objType = ass.GetType("NQueens.NQueen");
      // Create an instace of NQueens.NQueen
      var instance = Activator.CreateInstance(objType);

    var result = objType.InvokeMember("berekenQueens", 
    BindingFlags.InvokeMethod | 
    BindingFlags.Static | 
    BindingFlags.Public,
      null, 
      instance, 
    new object[] {   1, /* Row */ 
                     1, /* N */
                     new bool[,] { {true,false} } /* bord */
                    });

绑定器也使用参数来找到合适的方法。您没有方法void berekenQueens,因此使用null作为最后一个参数调用InvokeMember。arguments数组不会给出匹配的方法。您实际上不需要该实例,因为该方法是静态的,所以如果愿意,可以将其保留为null

      Type objType = ass.GetType("NQueens.NQueen");
      // Create an instace of NQueens.NQueen
      var instance = Activator.CreateInstance(objType);

    var result = objType.InvokeMember("berekenQueens", 
    BindingFlags.InvokeMethod | 
    BindingFlags.Static | 
    BindingFlags.Public,
      null, 
      instance, 
    new object[] {   1, /* Row */ 
                     1, /* N */
                     new bool[,] { {true,false} } /* bord */
                    });


您是否尝试过没有BindingFlags.Instance的失败行,因为它是一个静态方法?是的,相同的错误。我来自berekenQueens和bordValidatie方法的参数可能有问题。此程序集是真正创建的还是已经存在。。我想知道您是否在Assembly.LoadFrom和Assembly.loadfile之间左右为难,请使用Type.GetMethod+MethodInfo.Invoke改进代码。你会更快地发现你试图使用错误的重载方法。@HansPassant我已经试过了。MethodInfo[]methodInfos=this.GetType.GetMethodsBindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;methodInfos{Console.WriteLinemethodInfo.Name;}中的foreach MethodInfo MethodInfo在我的控制台中没有任何内容。您是否尝试了不带BindingFlags的失败行。实例,因为它是静态方法?是的,相同的错误。我来自berekenQueens和bordValidatie方法的参数可能有问题。此程序集是真正创建的还是已经存在。。我想知道您是否在Assembly.LoadFrom和Assembly.loadfile之间左右为难,请使用Type.GetMethod+MethodInfo.Invoke改进代码。你会更快地发现你试图使用错误的重载方法。@HansPassant我已经试过了。MethodInfo[]methodInfos=this.GetType.GetMethodsBindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;methodInfos{Console.WriteLinemethodInfo.Name;}中的foreach MethodInfo MethodInfo在我的控制台中没有任何内容。谢谢,但仍然是相同的错误。方法bordValidatie有5个参数,所以我认为调用需要更多参数?检查此链接,它显示了如何使用反射向方法发送参数。谢谢,但仍然是相同的错误。方法bordValidatie有5个参数,因此我认为调用需要更多参数?检查此链接,它显示了如何使用反射向方法发送参数。因为我使用反射,所以我可能不会添加引用NQueen,所以这不是一个选项?我添加了用于获取类型和创建实例的行,所以在您的场景中,这仍然有效…谢谢您,不再有MissingMethodException!单击菜单项时,您知道如何在当前项目中显示我的NQueens项目吗?我想我就快到了,加载NQueens.dll,调用与我的NQueens类相同的方法,但是我现在如何在我的窗口中显示呢;frm.Show;可能会让您开始…因为我使用的是反射,我可能不会添加引用NQueen,所以这不是一个选项?我添加了您用于获取类型和创建实例的行,因此在您的场景中,这仍然有效…谢谢,不再丢失MethodException!单击菜单项时,您知道如何在当前项目中显示我的NQueens项目吗?我想我就快到了,加载NQueens.dll,调用与我的NQueens类相同的方法,但是我现在如何在我的窗口中显示呢;frm.Show;可能会让你开始。。。