C# 未处理MissingMethodException
我正在通过反射创建一个程序集。当我尝试运行我的应用程序时,我在以下位置得到一个MissingMethodExection: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
// 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;可能会让你开始。。。