我正在尝试在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
),不接受任何参数,这是一个重载方法。那是我出错的地方还是其他地方?
还有另一种方法可以调用不接受任何参数的方法吗?我尝试了here发布的解决方案,但它无效。
答案 0 :(得分:11)
如果存在重载并且您想要调用没有参数的方法,这是正确的解决方案:
MethodInfo mi = obj.GetType().GetMethod("Foo", new Type[] { });
答案 1 :(得分:8)
如果有多个具有指定名称的方法,则方法Type.GetMethod(string methodName)
会抛出您提到的异常(请参阅this MSDN topic)。正如你所说的那样,Foo
是一个重载,我怀疑同一个DLL中有多个Foo
方法。如果您有方法:
IList<string> Foo()
IList<string> Foo(object someParameter)
方法GetMethod(string methodName)
无法确定您想拥有哪一个。在这种情况下,您应该使用方法GetMethods
并自行确定正确的方法。
答案 2 :(得分: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");
答案 3 :(得分:0)
感谢。
我的“模糊匹配发现”是我在名为Bio的ASCX(前端)中有一个文本框,列表视图中名为Bio的数据元素&lt;%#DataBinder.Eval(Container.DataItem,“Bio”)%&gt;我在.CS。中命名了一个字符串变量Bio。
没有构建错误或“红线”但在运行时生成错误。我以不同的方式重命名变量,错误消失了。编写代码的程序员没有遵循BioTxt等命名约定。这样可以消除错误。