如何识别EXE是否为WPF

时间:2009-07-16 08:59:45

标签: wpf winforms

我试图找出一个EXE是WPF应用程序还是WinForms应用程序。关于如何解决这个问题的任何建议?

我听说我可以使用Reflector工具,如果是这样的话怎么办呢?

感谢。

4 个答案:

答案 0 :(得分:6)

虽然通常应用程序可以被归类为“要么”WPF或WinForms应用程序,所以可以实现互操作性,以便WinForms应用程序可以“托管”WPF控件,反之亦然。由于您的应用程序听起来像是引用了两组程序集,因此可以同时使用它们。只是需要注意的事情。

无论如何,我刚刚在 Reflector 中打开了我的一个WPF项目,并且有一些明显的迹象表明它是一个WPF应用程序:

1)有一个 App 类,其StartupUriXaml个文件(如下所示)

public class App : System.Windows.Application
{
    // Methods
    [DebuggerNonUserCode]
    public void InitializeComponent()
    {
        base.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    }

2)EXE中有 XamlGeneratedNamespace

3)在资源'文件夹中'有.baml个文件(可能在<Application1>.g.resources内)。

4)窗口类(如果你可以在Reflector树中轻松找到它们)实现:

public class Window1 : System.Windows.Window
, System.Windows.Markup.IComponentConnector {

如果您真的想详细浏览Reflector,WinForms窗口将继承System.Windows.Forms.Form,这样您就可以轻松发现两者 WinForms和WPF。

答案 1 :(得分:3)

您可以使用代码检查.exe,不需要Reflector。

只需在.exe程序集中找到一个类型,该类型继承自来自PresentationFramework dll的System.Windows.Application类(您可以使用反射执行此操作)。

现在,这不是一个100%肯定的方法,因为理论上有人可能正在创建一个继承自wpf Application类的类,然后不启动应用程序。确定的方法是检查Reflector是否调用了类的Run()方法。

检查运行代码的当前应用程序是否为wpf应用程序的编程方式如下:

public static bool IsWpfApplication
{
    get { return System.Windows.Application.Current != null; }
}

答案 2 :(得分:2)

用反射器打开它,看看它是否引用了一个PresentationFramework DLL(然后它可能是WPF)或System.Windows.Forms.dll。请注意,应用程序可能会引用两者 - 在这种情况下,您无法真正说出来。

通过查看应用程序可能会更容易。即使使用标准控件,WPF应用程序也可以更流畅。

答案 3 :(得分:1)

一般来说,一个死亡的东西是WPF应用程序倾向于在焦点项目(例如按钮或列表框)上具有不同的焦点矩形。标准的Windows焦点矩形是1px宽,在WPF应用程序上它似乎只是看起来......不同。

此外,WPF应用程序会在需要执行某种动画时将大多数元素呈现给内存位图,这会在特定动画发生并显示在屏幕上时产生“模糊”,几乎是动画的外观。单击后,在菜单高亮显示,滚动或常规按钮文本等操作中会注意到此效果。