我有几个小型控制台应用程序继承自公共BaseExe
。独立地按预期正常工作。我需要通过中央位置提供对这些应用程序的访问以便执行。
我的想法是这是一个小型的Web应用程序,它为用户提供了可以执行的所有可用exe的列表。目前,我使用web.config
文件来定义我的选项。然而,我希望这个更加动态,因为这个列表将会增长。我认为可以使用反射来确定服务器目录中可执行文件的类型,并根据可用内容生成列表。至少,生成此列表所需的信息是
所有exe都具有相同的依赖关系,并且位于同一服务器目录中。
实际上,我的尝试是
Assembly.LoadFile
Name
和Description
值
我可以以某种方式绕过第二步,因为我可以检查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
属性。我目前的做法是行不通的。我将查看自定义属性作为替代,并使用它来保存信息。要求仍然保持不变。
答案 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);
}
}
}