如何识别EXE是否为WPF

如何识别EXE是否为WPF,wpf,winforms,Wpf,Winforms,我试图找出EXE是WPF应用程序还是WinForms应用程序。有什么建议可以让我做这件事吗 我听说我可以使用反射器工具,如果可以,怎么做 谢谢。用reflector打开它,看看它引用的是PresentationFramework dll(很可能是WPF)还是System.Windows.Forms.dll。请注意,应用程序可能会同时引用这两个方面——在这种情况下,您无法真正判断 也许仅仅通过查看应用程序就更容易了。即使使用标准控件,WPF应用程序的渲染也会更加平滑。通常,WPF应用程序的一个致命

我试图找出EXE是WPF应用程序还是WinForms应用程序。有什么建议可以让我做这件事吗

我听说我可以使用反射器工具,如果可以,怎么做


谢谢。

用reflector打开它,看看它引用的是PresentationFramework dll(很可能是WPF)还是System.Windows.Forms.dll。请注意,应用程序可能会同时引用这两个方面——在这种情况下,您无法真正判断


也许仅仅通过查看应用程序就更容易了。即使使用标准控件,WPF应用程序的渲染也会更加平滑。

通常,WPF应用程序的一个致命缺陷是,在按钮或列表框等聚焦项目上,往往会有一个外观不同的聚焦矩形。标准的Windows焦点矩形是1px宽,在WPF应用程序上,它看起来只是。。。不一样


此外,WPF应用程序在需要执行某种动画时会将大多数元素渲染到内存位图中,这会导致在特定动画发生并显示在屏幕上时产生“模糊”的、几乎是动画化的外观。这种效果在单击后的菜单突出显示、滚动或常规按钮文本中都可以看到。

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

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

1) 有一个
App
类有一个
StartupUri
,它是一个
Xaml
文件(如下所示)

2) EXE中有一个
XamlGeneratedNamespace

3) 在资源的“文件夹”中有
.baml
文件(可能在
.g.Resources
中)

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

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

如果您真的想详细浏览Reflector,WinForms windows将继承自
System.windows.Forms.Form
,这样您就可以很容易地发现其中是否同时包含WinForms和WPF。

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

只需在.exe程序集中查找一个类型,该类型继承自PresentationFramework dll中的System.Windows.Application类(您可以使用反射)

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

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

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

我也想知道这一点…如果同时引用PresentationFramework和System.Windows.Forms,则是的。我之所以问这个问题,是因为我的工作要求我创建一个模拟应用程序,以演示我们可以根据我们已经使用的应用程序(似乎是WPF)对客户做些什么(没有功能)。该应用程序似乎有功能区控件和汇总菜单控件。很顺利,只是有了另一个想法,但这并不是对原来问题的回答。您可以启动该应用程序,并使用Windows UI Automation(随Windows SDK提供的UISpy)对其进行检查,并查找典型的WPF功能。但是,无论如何,现在CraigD为您提供了一个很好的解决方案,它可能在大多数情况下都能工作,除非用户做了一些伪装应用程序的东西(或者它是一个从SWF移植到WPF的遗留应用程序)。
public static bool IsWpfApplication
{
    get { return System.Windows.Application.Current != null; }
}