我正在尝试在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
), 不接受任何参数,它是一个重载方法。这是我出错的地方还是其他地方?
是否有另一种方法来调用不接受任何参数的方法?我尝试了解决方案张贴在这里,但它不工作。
如果存在重载,并且您希望调用不带参数的方法,下面是正确的解决方案:
MethodInfo mi = obj.GetType().GetMethod("Foo", new Type[] { });
如果有多个具有指定名称的方法,方法Type.GetMethod(string methodName)
将抛出您提到的异常(请参阅此MSDN主题)。正如你所说的,Foo
是一个过载,我怀疑在同一个DLL中有多个Foo
方法。例如,如果你有以下方法:
IList<string> Foo()
IList<string> Foo(object someParameter)
方法GetMethod(string methodName)
无法确定您想要的是哪一个。在这种情况下,您应该使用GetMethods
方法,并自行确定正确的方法。
谢谢大家的帮助!!
正如我告诉你的,我正在调用的方法(即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");
谢谢。
我的"找到了模棱两可的匹配"是我在ASCX(前端)中有一个名为Bio的文本框,在listview中有一个名为Bio的数据元素<%# DataBinder.Eval(Container)。DataItem, "Bio")%>,我在。cs .
中命名了一个字符串变量Bio。没有构建错误或"红线",但在运行时生成错误。我重新命名了变量,错误就消失了。编写代码的程序员没有遵循像BioTxt这样的命名约定。这将消除错误。