C # - Cách nhận Tệp chương trình (x86) trên Windows 64 bit


153

Tôi đang sử dụng:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

Để xác định xem chương trình có được phát hiện trên máy người dùng không (không lý tưởng, nhưng chương trình tôi đang tìm kiếm là một phần mềm cũ của ứng dụng MS-DOS và tôi không thể nghĩ ra phương pháp khác).

Trên Windows XP và các phiên bản 32 bit của Windows Vista, nó hoạt động tốt. Tuy nhiên, trên x64 Windows Vista, mã trả về thư mục Tệp chương trình x64, trong khi ứng dụng được cài đặt trong Tệp chương trình x86. Có cách nào để lập trình trở lại đường dẫn đến Tệp chương trình x86 mà không cần nối cứng "C: \ Chương trình tệp (x86)" không?


9
Điều đáng chú ý là điều này chỉ trả về "Tệp chương trình" trong ứng dụng 64 bit trên HĐH 64 bit. Nếu bạn biên dịch ứng dụng của mình cụ thể là x86 thì nó sẽ trả về "Tệp chương trình (x86)" trên HĐH 64 bit bằng mã này.
VitalyB

Câu trả lời:


230

Hàm bên dưới sẽ trả về Program Filesthư mục x86 trong cả ba cấu hình Windows này:

  • Windows 32 bit
  • Chương trình 32 bit chạy trên Windows 64 bit
  • Chương trình 64 bit chạy trên windows 64 bit

 

static string ProgramFilesx86()
{
    if( 8 == IntPtr.Size 
        || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
Bất cứ ai có thể nhận xét là liệu điều này làm việc trong một môi trường địa phương? Cảm ơn trước ...
Tom

Tại sao thử nghiệm này: 8 == IntPtr.Size?
Florian

1
@Florian là một thử nghiệm để kiểm tra quy trình 64 bit
JaredPar

10
Tại sao không chỉ Environment.Is64BitOperatingSystemhay Environment.Is64BitProcess?
osvein

7
@anustart Điều này đã được trả lời vào năm 2008, trước khi các phương thức đó có sẵn trong .NET 4.0.
Rotem

135

Nếu bạn đang sử dụng .NET 4, có một bảng liệt kê thư mục đặc biệt ProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
Làm thế nào điều này hoạt động trên một hệ điều hành 32 bit? Nó có trả về "c: \ Chương trình tập tin" mà không có x86 không?
Marcel Gosselin

6
Đúng. Nó sẽ trả về các tệp c: \ chương trình trên x86 và tệp c: \ chương trình (x86) trên các cửa sổ 64 bit.
Nathan

2
Tự kiểm tra - trên Server 2003 32 bit, điều này trả về chuỗi trống cho tôi: Console.WriteLine ("X86:" + System.En Môi.GetFolderPath (System.En môi.ecialFolder.ProgramFilesX86));
David Eison

4
Đồng thời trả về chuỗi trống trên Windows XP (32 bit)
Patrick McDonald

12
Tài liệu của Microsoft tuyên bố: "Trên hệ thống x86, chuyển thành viên ProgramFilesX86 cho phương thức Môi trường.GetFolderPath trả về String.Empty; thay vào đó, hãy sử dụng thành viên ProgramFiles. Bạn có thể xác định xem Windows có phải là hệ điều hành 32 bit hay không bằng cách gọi thuộc tính của môi trường.Is64BitOperatingSystem . "
goodies4uall

42
Environment.GetEnvironmentVariable("PROGRAMFILES(X86)") ?? Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)

14

Tuy nhiên, lưu ý rằng ProgramFiles(x86)biến môi trường chỉ khả dụng nếu ứng dụng của bạn đang chạy 64 bit.

Nếu ứng dụng của bạn đang chạy 32 bit, bạn chỉ có thể sử dụng ProgramFilesbiến môi trường có giá trị thực sự là "Tệp chương trình (x86)".


Đúng đủ rồi. Tuy nhiên, rõ ràng là ứng dụng của anh ta đang chạy dưới dạng 32 bit, nếu không, GetFolderPath () dù sao cũng sẽ trả về đúng thư mục x86.
tomasr

Rất hữu ích! Điều này chỉ giúp tôi tiết kiệm hàng giờ làm việc! và cứu người khỏi phải sử dụng mã của tôi. Thật tuyệt vời khi mọi thứ hoạt động tốt!
David Silva Smith

9

Một cách sẽ là tìm kiếm biến môi trường "ProgramFiles (x86)":

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");

5

Tôi đang viết một ứng dụng có thể chạy trên cả nền tảng x86 và x64 cho Windows 7 và truy vấn biến dưới đây chỉ cần kéo đường dẫn thư mục tệp chương trình bên phải trên bất kỳ nền tảng nào.

Environment.GetEnvironmentVariable("PROGRAMFILES")

Thực sự, điều này nên được đánh dấu là một câu trả lời chấp nhận được quá. Điều này tốt hơn nhiều so với việc thực hiện các bài kiểm tra logic. Tuy nhiên, nó sẽ trả về thư mục phù hợp với loại bit được biên dịch của ứng dụng. Có nghĩa là, nếu bạn biên dịch ứng dụng ở 32 bit, nó sẽ trả về "Tệp chương trình" trên HĐH 32 bit và "Tệp chương trình (x86)" trên HĐH 64 bit. HOÀN HẢO!
Đệ

Hãy cẩn thận: câu hỏi là "Cách lấy Tệp chương trình (x86) trên Windows 64 bit" chứ không phải "Cách lấy đúng thư mục Tệp chương trình của ứng dụng đang chạy". Vì vậy, câu trả lời này, đúng về mặt chức năng, không phải là một câu trả lời có liên quan cho câu hỏi.
gấu bông

0

Một lớp lót sử dụng phương thức mới trong .NET. Sẽ luôn trả về thư mục Tệp chương trình x86.

Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))


0

Mã C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

Đầu ra:

C: \ Tệp chương trình (x86)

Ghi chú:

Chúng ta cần nói với trình biên dịch không thích một nền tảng xây dựng cụ thể.

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

Lý do:

Theo mặc định cho hầu hết các dự án .NET là "Bất kỳ CPU 32 bit nào được ưu tiên"

Khi bạn bỏ chọn lắp ráp 32 bit sẽ:

Mã JIT thành 32 bit trên quy trình 32 bit

Mã JIT thành 32 bit trên quy trình 64 bit

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.