我试图找出一个EXE是WPF应用程序还是WinForms应用程序。关于如何解决这个问题的任何建议?
我听说我可以使用Reflector工具,如果是这样的话怎么办呢?
感谢。
答案 0 :(得分:6)
虽然通常应用程序可以被归类为“要么”WPF或WinForms应用程序,所以可以实现互操作性,以便WinForms应用程序可以“托管”WPF控件,反之亦然。由于您的应用程序听起来像是引用了两组程序集,因此可以同时使用它们。只是需要注意的事情。
无论如何,我刚刚在 Reflector 中打开了我的一个WPF项目,并且有一些明显的迹象表明它是一个WPF应用程序:
1)有一个 App
类,其StartupUri
为Xaml
个文件(如下所示)
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应用程序会在需要执行某种动画时将大多数元素呈现给内存位图,这会在特定动画发生并显示在屏幕上时产生“模糊”,几乎是动画的外观。单击后,在菜单高亮显示,滚动或常规按钮文本等操作中会注意到此效果。