我有几个继承自通用BaseExe
的小型控制台应用程序。各自独立地按预期正确工作。我需要通过执行的中心位置提供对这些应用程序的访问。
我的想法是这是一个小的web应用程序,为用户提供所有可用的exe的列表,可以执行。目前,我使用web.config
文件来定义我的选项。然而,我希望这个列表更加动态,因为这个列表将不断增长。我认为可以使用反射从服务器目录中确定可执行文件的类型,并基于可用的内容,从中生成列表。至少,生成这个列表所需的信息是
- exe的路径(我有)
- 名称和描述(这是我需要得到的)
所有的exe都有相同的依赖关系,并且位于相同的服务器目录。
实际上,我一直在尝试
- 从服务器目录 获取exe的列表
- 使用
Assembly.LoadFile
检查每个exe的类型 - 获取exe 的
Name
和Description
值我可以绕过第二步,因为我可以检查GetReferencedAssemblies
的结果包含BaseExe
类型的程序集。然而,最后一部分完全避开了我。
var path = @"C:CodeESG ServerExeOutputbindebug";
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#控制台应用程序的基本类型?
简化费用
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
属性在构造函数中设置。我目前的方法行不通。我将研究自定义属性作为一种替代方法,并使用它来保存信息。
using System;
using System.IO;
using System.Reflection;
class Sample {
static void Main(){
var path = @"C:CodeESG ServerExeOutputbindebug";
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);
}
}
}