gpt4 book ai didi

C# 'could not found' 现有方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:57 26 4
gpt4 key购买 nike

您好!我一直在(稍微)研究 C# 及其程序集。所以我发现了一个有趣的特性,如动态加载程序集和调用它的类成员。谷歌了一下,我在这里,写了某种“程序集浏览器”。 (我使用了来自 hereherehere 的部分代码,但没有一个给出任何预期结果)。

但是我发现了一个小错误:当我尝试从我加载的程序集中调用类方法时,应用程序引发了 MissingMethod 异常。我确定我正在加载的 DLL 包含我正在尝试调用的类和方法(我的应用程序确保我以及 RedGate 的 .NET Reflector):

alt text

主要应用程序代码似乎没问题,我开始考虑我的 DLL 是否有问题...啊,我已经将两个项目放在一个解决方案中,但我认为这不会造成任何麻烦.是的,DLL 项目有“类库”目标,而主应用程序有“控制台应用程序”目标。

那么,问题是:他们怎么了?

这里是一些源代码:

动态链接库源:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
public class Class1
{
public void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
}

主要应用来源:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFrom(@"a\long\long\path\ClassLibrary1.dll");

try
{
foreach (Type t in asm.GetTypes())
{
if (t.IsClass == true && t.FullName.EndsWith(".Class1"))
{
object obj = Activator.CreateInstance(t);
object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, null); // Exception is risen from here
}
}
}
catch (Exception e)
{
System.Console.WriteLine("Error: {0}", e.Message);
}

System.Console.ReadKey();
}
}
}

UPD:适用于一种情况 - 当 DLL 方法不带参数时:

DLL 类(如果方法不是静态的,也有效):

public class Class1
{
public static void Main()
{
System.Console.WriteLine("Hello, World!");
}
}

方法调用代码:

object res = t.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, null);

最佳答案

您可能会弄错 InvokeMember() 参数。这是一个有效的示例:

using System;
using System.Reflection;

class Program {
static void Main(string[] args) {
if (args.Length > 0) Console.WriteLine(args[0]);
else {
Assembly asm = Assembly.LoadFrom(Assembly.GetEntryAssembly().Location);
foreach (Type t in asm.GetTypes()) {
if (t.IsClass == true && t.FullName.EndsWith(".Program")) {
//object obj = Activator.CreateInstance(t);
object res = t.InvokeMember("Main",
BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod,
null, null,
new object[] { new string[] { "Invoked" } });
}
}
}
}
}
  • 请注意 Main() 方法不是公开的,因此 BindingFlags.NonPublic
  • 请注意 Main() 方法是静态的,因此 BindingFlags.Static
  • 出于同样的原因,为目标参数传递null
  • 出于同样的原因,CreateInstance 不是必需的
  • 请注意 Main() 方法如何接受一个 string[] 参数,您必须将其传递给反射以找到正确的方法重载。

对您的 Main() 方法遵循相同的逻辑:

                object res = t.InvokeMember("Main",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null, obj,
new object[] { });

关于C# 'could not found' 现有方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708150/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com