【问题标题】:Reading the Type details from referenced dll/ assembly从引用的 dll/程序集中读取类型详细信息
【发布时间】:2016-06-06 13:13:18
【问题描述】:

我有两个 dll 文件,比如说 DataLayer.dll 和 ProcessLayer.dll。 DataLayer.dll 有一个名为 MyClass 的类,如下所示:

public class MyClass
{
public string name;
public int age;
public string aadhar;
}

我已经在第二个程序集 ProcessLayer.dll 中引用了 DataLayer.dll,它有一个输入参数为 MyClass 的方法。

using DataLayer;
namespace ProcessLayer
{
  public class Process
  {
    public int GetMyClass(MyClass objMy)
    {
        return objMy.age;
    }
  }
}

如何使用反射从ProcessLayer.dll 读取所有方法参数?我正在使用

Assembly assembly = Assembly.LoadFile(@"C:\ProcessLayer.dll");
foreach (Type _type in assembly.GetTypes())
{
    foreach (var method in _type.GetMethods())
    {
         var parameters = method.GetParameters();
    }
}

并在尝试执行method.GetParameters(); 语句时出错。

你能帮帮我吗?

如何通过 Mono.cecil 获得它?

【问题讨论】:

  • method.GetParameters() 出现什么错误?
  • 得到“无法加载文件或程序集 'DataLayer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。”错误
  • 从不、使用 LoadFile()。在这种情况下,普通的 Load() 应该可以工作。如果您真的需要指定路径,请使用 LoadFrom()。希望你不这样做,当你开始从根目录加载程序集时,没有什么好事发生。

标签: c# .net system.reflection mono.cecil assembly.reflectiononly


【解决方案1】:

您需要加载程序集,然后获取类型,然后获取您所追求的类型的方法。

var myAssembly Assembly.LoadFrom(@"..\ProcessLayer.dll");
var myAssemblyTypes =  myAssembly.GetTypes();
var firstType = myAssemblyTypes[0];
var firstTypeMethods = firstType.GetMethods();
var firstTypeFirstMethod = firstTypeMethods[0];
var params = firstTypeFirstMethod.GetParameters();

如果您需要来自另一个程序集的类型,那么您可以加载它,您可能还需要实例化它。

Assembly assembly = Assembly.LoadFrom("Assembly.LoadFile(@"..\DataLayer.dll");
Type missingType = assembly.GetType(<your missing type>);
var createTypeInstance = Activator.CreateInstance(missingType);

【讨论】:

  • 我可以使用 GetMethods() 获取方法名称;但我正在寻找一种方法来使用反射获取每种方法的参数列表。这里方法参数是从另一个 dll 引用的。我卡在那里......
  • 好的,更新您的问题以询问参数然后,此时它询问方法名称:如何使用反射从 ProcessLayer.dll 读取所有方法名称?
  • 我认为您也应该可以加载第二个程序集。循环通过 myAssemblyName.GetReferencedAssemblies() 并加载它们。您需要确保它们可用,否则您将收到错误消息...
  • 如何通过加载第二个程序集来循环列表...我尝试将第二个程序集加载为 Assembly assembly1 = Assembly.LoadFile(@"C:\Home\TesingSolution\Processor\bin \Debug\DataLayer.dll");
  • 好吧,我不想得到类型名称。我需要方法参数列表,缺少的类型可以是在另一个(DataLayer.dll)中定义的任何东西,不能硬编码
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多