Как проверить базовый тип консольного приложения ac #? - PullRequest
0 голосов
/ 14 октября 2011

У меня есть несколько небольших консольных приложений, которые наследуются от общего BaseExe. Независимо каждый работает правильно, как ожидалось. Мне нужно предоставить доступ к этим приложениям через центральное местоположение для выполнения.

Моя идея в этом небольшом веб-приложении, которое предоставляет пользователям список всех доступных исполняемых файлов, которые могут быть выполнены. В настоящее время я использую файл web.config, чтобы определить мои параметры. Однако я хочу, чтобы это было более динамичным, поскольку этот список будет расти. Я подумал, что, возможно, можно использовать отражение, чтобы определить тип исполняемого файла из каталога сервера и на основе того, что доступно, сгенерировать список из них. Как минимум, информация, которая мне нужна для создания этого списка, составляет

  1. Путь exe (который у меня есть)
  2. Имя и описание (что мне нужно получить)

Все исполняемые файлы имеют одинаковые зависимости и находятся в одном каталоге сервера.

По сути, моя попытка была

  • Получить список exe-файлов из каталога сервера
  • проверьте тип каждого exe, используя Assembly.LoadFile
  • получить значения Name и Description для exe

Я могу как-то обойти второй шаг в том, что я могу проверить, что результат 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 */
    }
}

Редактировать: Я только что понял после ввода всего этого, что свойства Name и Description установлены в конструкторе. Мой нынешний подход не сработает. Я собираюсь изучить пользовательские атрибуты в качестве альтернативы и использовать это для хранения информации. Требование остается прежним.

1 Ответ

0 голосов
/ 14 октября 2011
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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...