Как определить, является ли EXE WPF - PullRequest
6 голосов
/ 16 июля 2009

Я пытаюсь выяснить, является ли EXE-приложение WPF или приложением WinForms. Любые предложения о том, как я могу пойти по этому поводу?

Я слышал, что могу использовать инструмент «Отражатель», если да, то как бы это сделать?

Спасибо.

Ответы [ 4 ]

6 голосов
/ 16 июля 2009

Хотя обычно приложение может быть классифицировано как «либо» приложение WPF или WinForms, взаимодействие возможно, так что приложение WinForms может «размещать» элементы управления WPF и наоборот. Поскольку ваше приложение звучит так, как будто оно ссылается на оба набора сборок, оно может использовать оба. Просто что-то, о чем нужно знать.

В любом случае, я только что открыл один из моих проектов WPF в Reflector и некоторые очевидные признаки того, что это приложение 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) В папке Resources находятся .baml файлы (вероятно, в пределах <Application1>.g.resources).

4) Классы окна (если их легко найти в дереве Reflector) реализуют:

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

Если вы действительно хотите детально просматривать Reflector, окна WinForms будут наследоваться от System.Windows.Forms.Form, так что вы можете легко определить, есть ли у вас и WinForms и WPF.

3 голосов
/ 16 июля 2009

Вы можете проверить .exe с кодом, вам не нужен Reflector.

Просто найдите тип в сборке .exe, который наследуется от класса System.Windows.Application, который находится в DLL PresentationFramework (вы можете сделать это с помощью отражения).

Теперь этот метод не на 100% уверен, так как теоретически кто-то может создать класс, который наследует класс приложения wpf, а затем не запускать приложение. Определенным способом является проверка в Reflector, вызывается ли метод класса Run ().

А программный способ проверить, является ли текущее приложение, в котором выполняется ваш код, приложением wpf, выглядит так:

public static bool IsWpfApplication
{
    get { return System.Windows.Application.Current != null; }
}
2 голосов
/ 16 июля 2009

Откройте его с помощью рефлектора и посмотрите, ссылается ли он на одну из DLL-файлов PresentationFramework (тогда это, вероятно, WPF) или System.Windows.Forms.dll. Обратите внимание, что приложения могут ссылаться на оба - в этом случае вы не можете точно сказать.

Может быть, проще просто посмотреть на приложение. Приложения WPF отображаются более плавно, даже со стандартными элементами управления.

1 голос
/ 16 июля 2009

Как правило, одно недоразумение состоит в том, что приложения WPF имеют разный вид прямоугольника фокуса на сфокусированных элементах, таких как кнопки или списки. Стандартный прямоугольник фокусировки Windows имеет ширину 1px, а в приложениях WPF он выглядит ... по-другому.

Кроме того, приложения WPF отображают большинство элементов в растровые изображения памяти всякий раз, когда им требуется выполнить какую-либо анимацию, и это приводит к «нечеткому», почти сглаженному виду, когда конкретная анимация происходит и отображается на экране. Этот эффект замечен в таких вещах, как выделение меню, прокрутка или общий текст кнопки после нажатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...