如何检查c#控制台应用程序的基本类型?

时间:2011-10-14 08:48:35

标签: c# reflection console

我有几个小型控制台应用程序继承自公共BaseExe。独立地按预期正常工作。我需要通过中央位置提供对这些应用程序的访问以便执行。

我的想法是这是一个小型的Web应用程序,它为用户提供了可以执行的所有可用exe的列表。目前,我使用web.config文件来定义我的选项。然而,我希望这个更加动态,因为这个列表将会增长。我认为可以使用反射来确定服务器目录中可执行文件的类型,并根据可用内容生成列表。至少,生成此列表所需的信息是

  1. exe的路径(我有)
  2. 名称和描述(这是我需要的)
  3. 所有exe都具有相同的依赖关系,并且位于同一服务器目录中。

    实际上,我的尝试是

    • 从服务器目录中获取exe列表
    • 使用Assembly.LoadFile
    • 检查每个exe的类型
    • 获取exe
    • NameDescription

    我可以以某种方式绕过第二步,因为我可以检查GetReferencedAssemblies的结果是否包含BaseExe类型的程序集。然而,最后一部分完全躲避了我。

    var path = @"C:\Code\ESG Server\ExeOutput\bin\debug";
    string[] filePaths = Directory.GetFiles(path, "*.exe");
    
    foreach (var exeReport in filePaths)
    {
        Assembly exe = Assembly.LoadFile(exeReport);
        var exeType = exe.GetType();
        var referencedAssemblies = exe.GetReferencedAssemblies();   
    }
    

    如何检查c#控制台应用程序的基本类型?

    简化的exes

    public class exe1 : BaseExe
    {
        public exe1 ()
        {
            this.Name = "exe1";
            this.Description = "exe1";
        }
    
        static void Main(string[] args){  
           var exe1 = new exe1();
           /* snip */
        }
    }
    
    public class exe2 : BaseExe
    {
        public exe2 ()
        {
            this.Name = "exe2";
            this.Description = "exe2";
        }
    
        static void Main(string[] args){  
           var exe2 = new exe2();
           /* snip */
        }
    }
    

    编辑:我刚刚在输入所有这些之后意识到在构造函数中设置了NameDescription属性。我目前的做法是行不通的。我将查看自定义属性作为替代,并使用它来保存信息。要求仍然保持不变。

1 个答案:

答案 0 :(得分:0)

using System;
using System.IO;
using System.Reflection;

class Sample {
    static void Main(){
        var path = @"C:\Code\ESG Server\ExeOutput\bin\debug";
        string[] filePaths = Directory.GetFiles(path, "*.exe");

        foreach (var exeReport in filePaths){
            Assembly exe = Assembly.LoadFile(exeReport);
            var exeType = exe.GetTypes()[0];//only one class;
            if(exeType.BaseType.Name != "BaseExe") continue;
            dynamic obj = exe.CreateInstance(exeType.Name);
            Console.WriteLine("Name:{0},Description:{1}", obj.Name, obj.Description);
        }
    }
}