【问题标题】:Load interface from assembly and use its methods从程序集中加载接口并使用它的方法
【发布时间】:2011-12-27 14:06:05
【问题描述】:

我目前正在学习 .NET 和 C#,所以我对它很陌生,我必须创建一个包含服务器和客户端的“通讯录”。我创建了一个服务器使用的接口,描述了此通讯录可用的操作,如下所示:

bool AjouterContact(string num, string nom, string prenom, string mail, string telephone);
bool SupprimerContact(string num);
bool ModifierContact(string num, string nom, string prenom, string mail, string telephone);
List<string[]> RecupererContacts();

我曾经在我的客户端中引用该接口的 .dll,它工作正常,但我现在需要动态加载这个 .dll。这就是我正在做的:

Assembly a = Assembly.LoadFrom("../../../RemotingInterfaces/bin/Debug/RemotingInterfaces.dll");
Module[] modules = a.GetModules();
Module module = modules[0];
Type[] types = module.GetTypes();
foreach (Type type in types)
{
    Console.WriteLine(" Le type {0} a cette (ces ) methode (s) : ", type.Name);
    Console.WriteLine("Type information for:" + type.FullName);
    Console.WriteLine("\tIs Class = " + type.IsClass);
    Console.WriteLine("\tIs Enum = " + type.IsEnum);
    Console.WriteLine("\tAttributes = " + type.Attributes);
    MethodInfo[] mInfo = type.GetMethods();
    foreach (MethodInfo mi in mInfo)
        Console.WriteLine(" {0}", mi);
}

这工作并在控制台中写入所有方法。但我想知道如何使用这些方法。

我希望我已经足够清楚了。同样,我是 .NET 和 C# 的新手,所以我真的不知道它是如何工作的。

【问题讨论】:

    标签: c# .net reflection interface


    【解决方案1】:

    接口只是一个契约,它是属性和方法的列表,而不是实际的实现。在您正在使用的 dll 中,界面看起来像这样

    public interface IJustAListOfThingsToImplement
    {
      int GetTheNumberOfStarsInTheSky();
    } 
    

    此时GetTheNumberOfStarsInTheSky()方法尚未实现,无法使用。

    底线是,你可以得到接口,但你不能使用它的方法,因为它还没有定义。

    希望这会有所帮助。

    【讨论】:

    • 但是这些方法是在我的服务器上的 RemoteOperation 类中实现的:MarshalByRefObject、RemotingInterfaces.IRemoteOperation。我过去常常通过引用客户端中的 .dll 并创建 RemotingInterfaces.IRemoteOperation 对象来调用这些方法。然后我只需要调用 remoteOperation.METHODNAME();所以我想我看起来像 wsanville 在下面回答的 MethodInfo.Invoke() 方法。
    【解决方案2】:

    使用MethodInfo.Invoke() 调用使用反射的方法。在您发布的示例中,您已经有一个存储在mInfo 中的方法数组。

    使用Invoke() 时,第一个参数是您正在调用方法(即,您正在调用方法的对象),第二个参数是params array对象,表示方法的参数。如果没有参数,你可以传递null

    【讨论】:

    • 我会尝试这种方式并告诉它进展如何。谢谢。
    • 这是我需要的方法,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多