2009-07-16 35 views
5

Tôi đang cố gắng tìm hiểu xem một EXE là một ứng dụng WPF hay một ứng dụng WinForms. Bất kỳ đề xuất về cách tôi có thể đi về điều này?Cách xác định xem EXE có phải là WPF

Tôi đã nghe nói rằng tôi có thể sử dụng công cụ Reflector, nếu như vậy làm thế nào điều này sẽ được thực hiện?

Cảm ơn.

+0

tôi muốn biết điều này quá ... – kevchadders

Trả lời

6

Mặc dù thường một ứng dụng có thể được phân loại là 'hoặc' một ứng dụng WPF hoặc WinForms, khả năng tương tác là có thể sao cho ứng dụng WinForms có thể 'lưu' các điều khiển WPF và ngược lại. Vì ứng dụng của bạn có vẻ như nó tham chiếu cả hai tập hợp, nên có thể đang sử dụng cả hai. Chỉ cần một cái gì đó để được nhận thức.

Dù sao, tôi vừa mới mở một trong những dự án WPF của tôi trong Reflector và một số dấu hiệu cho thấy rõ ràng đó là một ứng dụng WPF là:

1) Có một lớp App mà có một StartupUri mà là một Xaml tập tin (như thế này)

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

2) có một XamlGeneratedNamespace trong EXE

3) Trong tài khoản Tài nguyên 'có các tệp .baml (có thể là trong <Application1>.g.resources).

4) Các lớp cửa sổ (nếu bạn có thể tìm thấy chúng một cách dễ dàng trong cây Reflector) thực hiện:

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

Nếu bạn thực sự muốn trawl thông qua suy nghi trong từng chi tiết, WinForms cửa sổ sẽ kế thừa từ System.Windows.Forms.Form để bạn có thể dễ dàng phát hiện nếu bạn có cả hai WinForms và WPF trong đó.

2

Mở bằng phản xạ và xem liệu nó có tham chiếu đến một trong các tệp PresentationFramework DLLs (sau đó có thể là WPF) hoặc System.Windows.Forms.dll. Lưu ý rằng các ứng dụng có thể tham chiếu cả hai - trong trường hợp đó, bạn thực sự không thể biết được.

Có thể dễ dàng hơn khi xem ứng dụng. Các ứng dụng WPF được hiển thị mượt mà hơn, ngay cả với các điều khiển tiêu chuẩn.

+0

Yes nếu tài liệu tham khảo cả PresentationFramework và System.Windows.Forms Lý do tôi hỏi câu hỏi này là vì công việc của tôi đã yêu cầu tôi tạo một ứng dụng mockup để chứng minh những gì chúng tôi có thể làm cho khách hàng của mình (không có chức năng) dựa trên ứng dụng chúng tôi đã sử dụng là WPF). Ứng dụng này dường như có kiểm soát Ribbon và cũng là một điều khiển menu rollup. Rất trơn tru của nó. – JamesM

+0

Chỉ cần có một ý tưởng khác, đó không thực sự là câu trả lời cho câu hỏi ban đầu. Bạn có thể khởi động ứng dụng và kiểm tra nó bằng Windows UI Automation (UISpy được cung cấp cùng với Windows SDK) và tìm kiếm các tính năng WPF điển hình. Tuy nhiên, bây giờ CraigD đã cung cấp cho bạn một giải pháp tốt có khả năng hoạt động trong hầu hết các trường hợp, trừ khi người dùng thực hiện điều gì đó để che giấu ứng dụng (hoặc đó là ứng dụng cũ đang được chuyển từ SWF sang WPF). – OregonGhost

1

Nói chung một người chết cho là các ứng dụng WPF có xu hướng có hình chữ nhật lấy nét tìm kiếm khác nhau trên các mục trọng tâm như nút hoặc hộp danh sách. Tiêu chuẩn Windows tập trung hình chữ nhật là 1px rộng và trên các ứng dụng WPF nó có vẻ chỉ cần nhìn ... khác nhau.

Ngoài ra, các ứng dụng WPF hiển thị hầu hết các phần tử vào bitmap bộ nhớ bất cứ khi nào chúng cần thực hiện một số loại hoạt ảnh và kết quả là "mờ", gần như anitaliased bất cứ khi nào hoạt ảnh cụ thể diễn ra và được hiển thị trên màn hình. Hiệu ứng này được nhận thấy trong những thứ như, đánh dấu menu, cuộn hoặc văn bản nút chung sau khi bạn nhấp vào.

3

Bạn có thể kiểm tra .exe bằng mã, bạn không cần Reflector.

Đơn giản chỉ cần tìm một loại trong hội đồng .exe mà kế thừa từ lớp System.Windows.Application là từ dll PresentationFramework (bạn có thể làm điều đó với sự phản ánh).

Bây giờ, đây không phải là phương pháp chắc chắn 100%, vì lý thuyết ai đó có thể tạo lớp học kế thừa từ lớp Ứng dụng wpf, sau đó không khởi động ứng dụng. Cách xác định là kiểm tra trong Reflector nếu phương thức Run() của lớp đó được gọi.

Và cách chương trình để kiểm tra xem các ứng dụng hiện tại, trong đó mã của bạn đang chạy là một ứng dụng WPF là như thế này:

public static bool IsWpfApplication 
{ 
    get { return System.Windows.Application.Current != null; } 
} 
Các vấn đề liên quan