我正在尝试确定一个C#程序集是GUI还是控制台应用程序,以构建一个工具,该工具将自动重新创建丢失的快捷方式。
目前,我有一个例程,它递归地遍历Program Files(和x86目录)中的所有目录。
对于它找到的每个EXE文件,该工具调用IsGuiApplication,传递EXE的名称。
从那里,我使用LoadFrom创建一个Assembly对象。我想检查这个程序集是否有GUI输出,但我不确定如何在C#中进行测试。
我的当前想法是使用GetStdHandle,但我不知道如何将其应用于运行中的应用程序之外的程序集。
由于我在C#反射方面的经验有限,因此任何帮助都将不胜感激。
目前,我有一个例程,它递归地遍历Program Files(和x86目录)中的所有目录。
对于它找到的每个EXE文件,该工具调用IsGuiApplication,传递EXE的名称。
从那里,我使用LoadFrom创建一个Assembly对象。我想检查这个程序集是否有GUI输出,但我不确定如何在C#中进行测试。
我的当前想法是使用GetStdHandle,但我不知道如何将其应用于运行中的应用程序之外的程序集。
由于我在C#反射方面的经验有限,因此任何帮助都将不胜感激。
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace BatchShortcutBuild
{
class Program
{
//I'm uncertain that I need to use this method
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
static void Main(string[] args) {
BuildShortcuts();
Console.ReadLine();
}
public static void BuildShortcuts() {
String dirRoot = "C:\\Program Files\\";
processRoot(dirRoot);
dirRoot = "C:\\Program Files (x86)\\";
processRoot(dirRoot);
Console.WriteLine("Finished enumerating files");
Console.ReadLine();
}
public static void processRoot(String path) {
try {
foreach (String theDir in Directory.EnumerateDirectories(path)) {
processRoot(theDir);
}
foreach (String theFile in Directory.EnumerateFiles(path, "*.exe")) {
if (IsGuiApplication(theFile)) {
//I would generate a shortcut here
}
}
} catch { }
}
public static bool IsGuiApplication(String filePath) {
Console.WriteLine(filePath);
Assembly a = Assembly.LoadFrom(filePath);
//How to get the program type from the assembly?
return false;
}
}
}
System.Windows.Forms.Form
派生的类,这将是它包含Windows Forms GUI的提示。我不确定如何检查程序集是否包含WPF GUI。 - cbr