2010-09-05 30 views
8

Tôi xin lỗi trước nếu đây thực sự là một câu hỏi của Super User ... Tôi không chắc lắm, nhưng điều này có vẻ nhiều hơn về dev. bên cạnh phía hỗ trợ kỹ thuật. :)Tìm nguồn gốc của các ngoại lệ được quản lý không đến trực tiếp từ mã của tôi?

Đây không nhất thiết phải là vấn đề, nhưng nó thực sự khiến tôi hoàn toàn điên cuồng trên hệ thống của mình. Nó cũng chỉ xảy ra trên máy tính của tôi.

Khi tôi khởi chạy bất kỳ ứng dụng, thậm chí là một ứng dụng WPF trống, tôi thấy Bốn trường hợp ngoại lệ:

Một ngoại lệ cơ hội đầu tiên của loại 'System.IO.DirectoryNotFoundException' xảy ra ở PresentationCore.dll
Một ngoại lệ cơ hội đầu tiên của loại 'System.ArgumentException' xảy ra trong mscorlib.dll
Ngoại lệ đầu tiên của loại 'System.ArgumentException' xảy ra trong mscorlib.dll
Ngoại lệ đầu tiên của loại 'System.InvalidOperationException' xảy ra trong PresentationCore. dll

Để tìm ra nơi này đến từ đâu, tôi sau đó đặt VS2008 để phá vỡ trên bất kỳ trường hợp ngoại lệ CLR ném, và đây là thông tin:

Exception # 1:
Không thể tìm thấy một phần của đường dẫn 'D: \ Dell \ Reader2.0 \ SPLASH.SYS \ fonts \ AscenderUni.ttf'.

Ngoại lệ # 2:
Tên văn hóa 'ug' không được hỗ trợ.
Tên thông số: tên

Ngoại lệ # 3:
Tên văn hóa 'ug' không được hỗ trợ.
tên Parameter: tên

Exception # 4:
Không có đăng ký CultureInfo với 'ug' các IetfLanguageTag.

Tôi đã xem qua Process Monitor và Process Explorer. Process Monitor cho thấy ứng dụng của tôi đang thực hiện RegQueryValue, điều mà tôi chắc chắn không chịu trách nhiệm ... nhưng một số DLL (có lẽ là từ crapware của Dell) đang được nạp bởi quá trình của tôi và đang đọc regkey này. Sau đó tôi đã xem Process Explorer, hy vọng sẽ thấy những ứng dụng nào mà ứng dụng của tôi đang tải, nhưng không thể tìm thấy thông tin đó. Sau đó tôi đã thử PrcView và thấy các mô-đun mà ứng dụng của tôi đang tải.

Tôi rất ngạc nhiên khi thấy có bao nhiêu mô-đun khác đã được tải, nhưng tôi không thấy bất kỳ điều gì liên quan đến Dell. Tôi cũng tự hỏi làm thế nào nó có thể là một Norton Internet Security DLL đã được nạp vào quá trình của tôi, nhưng tôi giả định đó là dự định và một cái gì đó đặc biệt mà Norton không để đảm bảo rằng một quá trình là an toàn để thực thi.

Tôi có thể làm gì khác để xác định và loại bỏ những ngoại lệ này đến từ đâu?

CẬP NHẬT

Không chắc chắn nếu nó khó hiểu những gì tôi nhận được tại đây. Ngoại lệ này được nêu ra trong một DLL mà ứng dụng của tôi tải vì một lý do nào đó (tôi không tham khảo bất kỳ điều gì liên quan đến Dell từ dự án của tôi). Bây giờ tôi đã gỡ cài đặt ứng dụng đó và tôi vẫn còn có ngoại lệ ngu ngốc.Đó là tất cả về mặt kỹ thuật vì ngoại lệ được xử lý ở đâu đó, có lẽ nằm trong DLL đó, nhưng tôi chỉ cảm thấy khó chịu vì bốn thư phụ (thực ra là 8, vì tôi phải đóng hai hộp thoại cho mỗi ngoại lệ) bật lên khi tôi chạy ứng dụng của mình. Hãy gọi tôi là lười biếng, nhưng tôi chưa bao giờ yêu cầu DLL chết tiệt này tải ở nơi đầu tiên. :)

Có lẽ đã đến lúc sử dụng msconfig để bắt đầu vô hiệu hóa một số dịch vụ của Dell. Tôi sẽ chơi với điều đó sau khi tôi thực sự có thời gian rảnh.

Trả lời

17

Không có tệp tham nhũng. Vì tôi đã cố gắng săn lùng cái này một lúc, tôi đã tìm ra những gì đã xảy ra. Một nơi nào đó trên đường đi, một phông chữ đã được cài đặt với văn hóa Uighur, đó là, rõ ràng là một nền văn hóa Thổ Nhĩ Kỳ/Trung Quốc (tốt nhất là tôi có thể nói), và thẻ CultureInfo của họ? "ug". Khi các phông chữ được lưu trữ, hệ thống đã cố gắng tải văn hóa Uighur. Đáng buồn thay, cài đặt Windows của tôi dường như bị thiếu văn hóa này rõ ràng trong Windows. Biết rằng tôi sẽ không sử dụng văn hóa trên máy của mình sớm, tôi đã làm theo hướng dẫn trên MSDN để tạo và cài đặt một nền văn hóa mới.

Mặc dù lỗi sẽ không làm tổn hại đến bất kỳ thứ gì lớn. Nó chỉ là một ngoại lệ cơ hội đầu tiên, sau khi tất cả, nó đã gây phiền nhiễu các crap ra khỏi tôi. Vì vậy, đây là những gì tôi đã làm.

  1. Tạo ứng dụng bảng điều khiển mới.
  2. Thêm tham chiếu đến sysglobal.
  3. Thêm đoạn mã sau:

    var culture = new CultureAndRegionInfoBuilder("ug", CultureAndRegionModifiers.None); 
        var ci = new CultureInfo("en-US"); 
        var ri = new RegionInfo("US"); 
        culture.LoadDataFromCultureInfo(ci); 
        culture.LoadDataFromRegionInfo(ri); 
        culture.Register(); 
    
  4. xây dựng.

  5. Từ Windows Explorer (bạn cần đặc quyền quản trị để thực hiện việc này), hãy chạy tệp thực thi đã được biên dịch làm quản trị viên.

Nếu mọi việc suôn sẻ, bây giờ sẽ có tệp trong C: \ windows \ Toàn cầu hóa được gọi là "ug.nlp".

Bạn không nên nhận lại tin nhắn đó.

+0

Dude, thật tuyệt vời. Tôi sẽ thử cái này càng sớm càng tốt. Không thể tin rằng ai đó đã theo dõi cái này xuống! :) – Dave

+0

CNTT ĐÃ LÀM VIỆC !!! Cảm ơn nhiều. :) – Dave

+2

Tôi theo dõi nó xuống bởi vì tôi mệt mỏi khi nhấn "F5" mười hai lần để vào ứng dụng của tôi. Thở dài.Oh yeah, và đây là nơi * duy nhất tôi đã nhìn thấy lỗi này được đăng trực tuyến. –

0

Trường hợp ngoại lệ cơ hội đầu tiên là bình thường - những trường hợp này được hiển thị bất cứ khi nào ngoại lệ được ném, cho dù nó đã được xử lý hay chưa. Chúng tồn tại để bạn có thể truy cập vào mã của bạn và tìm hiểu lý do chúng được ném.

Tuy nhiên, nếu ngoại lệ đã được xử lý, sẽ không có vấn đề gì và việc thực thi sẽ tiếp tục.

Nếu ngoại lệ không được xử lý, ngoại lệ cơ hội thứ hai sẽ bị trình gỡ lỗi và việc thực hiện sẽ dừng lại.

Điều này là bình thường và không đáng lo ngại. Bạn luôn có thể ẩn chúng - xem this câu hỏi và câu trả lời để biết thêm chi tiết.

Liên quan đến ngoại lệ thực tế - có một số mã (bên thứ ba hoặc của riêng bạn) đang cố gắng truy cập ttf trong thư mục được đề cập, điều này không thể được tìm thấy, do đó ngoại lệ (đã được xử lý, vì vậy không có vấn đề gì).

Các trường hợp ngoại lệ khác là tạo một non existing CultureInfo (ug) - có lẽ điều này được cho là uk? Kiểm tra cấu hình và mã cho việc này.

Các giá trị này có thể được định cấu hình trong sổ đăng ký.

+0

Tôi hiểu, và phần buồn cười là tôi không xử lý những trường hợp ngoại lệ bất cứ nơi nào trong mã của tôi, vì vậy nó phải được xử lý bởi bất cứ điều gì DLL đang nhận được nạp. Tôi hy vọng sẽ tìm ra những gì DLL này là, vì vậy tôi có thể gỡ bỏ cài đặt/xóa nó khỏi hệ thống của tôi. Tôi biết tôi có thể bỏ qua điều này một cách an toàn, nhưng lý do tại sao nó trở nên căng thẳng là khi tôi gặp sự cố khi gỡ lỗi, tôi bật tùy chọn để phá vỡ bất cứ khi nào ngoại lệ đầu tiên bị ném và tôi luôn phải trải qua F5. Đậu nhỏ, nhưng vẫn còn khó chịu. :) Điểm tốt về CultureInfo - tôi chưa bao giờ nhìn vào điều này. Mỹ hoặc Anh tôi đoán. – Dave

+0

@Dave: Những gì bạn đang nói số tiền để nói rằng WPF không bao giờ nên sử dụng ngoại lệ ở bất kỳ đâu trong mã của nó. Điều đó không có ý nghĩa. Ngoại lệ là một tính năng tiêu chuẩn, bình thường của môi trường. – Timwi

+0

@Timwi Những gì tôi đang cố gắng làm là để xác định nguồn gốc của một ngoại lệ đến từ một DLL mà tôi đã không tải một cách rõ ràng bản thân mình. Tôi hoàn toàn ổn với ngoại lệ ... không chắc tại sao bạn lại nghĩ rằng tôi đang nói khác. :) – Dave

1

Đó là rất không phải là thiết bị xẻng trên máy của bạn. Các DLL này cần phải tự chèn chúng vào các chương trình không được quản lý, chúng phải được viết bằng một ngôn ngữ không phụ thuộc vào CLR, như C hoặc C++. Và tương ứng không thể tạo ra ngoại lệ được quản lý.

Những ngoại lệ này trông giống như sự cố cấu hình máy đối với tôi. Rác trong registry của bạn. Tên văn hóa xấu (nghe như "chúng tôi" bị hỏng "ug") tạo ra ba trong số đó, phông chữ có thể được liệt kê trong sổ đăng ký nhưng bị thiếu trong đĩa.

Ngắn từ cài đặt lại hệ điều hành, bạn có thể chẩn đoán điều này bằng cách sử dụng cả ProcMon và trình gỡ lỗi. Sử dụng hộp kiểm Debug + Exceptions, Thrown để buộc trình gỡ lỗi dừng lại trên ngoại lệ cơ hội đầu tiên. Khi nó chạm, chuyển sang ProcMon, khóa hoặc tệp sổ đăng ký sẽ hiển thị rất gần cuối dấu vết.

+0

đó chắc chắn là những gì tôi đã làm - các bước gỡ lỗi thông thường của tôi trong phát triển .NET luôn quay trở lại để kiểm tra hộp phá vỡ khi ngoại lệ được ném. Tôi cũng sử dụng Process Monitor để lọc trên regkey, và có vẻ như nó đến từ ứng dụng của tôi. Nhưng tôi biết rằng nó không đến trực tiếp từ mã * của riêng tôi, vì vậy tôi bị bối rối. Tôi không thể tìm thấy bất kỳ nội dung nào trên web về tệp cụ thể này mà nó đang cố mở. – Dave

+0

Vâng, có vẻ như các DLL cố gắng để tải phông chữ phải là Dell ON Reader 2.0 (bất cứ điều gì đó là ... có lẽ là đầu đọc thẻ phương tiện truyền thông, mà máy tính của tôi thậm chí không có). Tôi đã gỡ cài đặt ứng dụng và sự cố vẫn còn đó. Ugh. – Dave

+0

@Dave, không hoàn toàn, nó có nghĩa là một cái gì đó trong 'PresentationCore.dll' đang cố gắng tải một tập tin * font * từ' D: \ Dell \ Reader2.0 \ SPLASH.SYS \ fonts \ AscenderUni.ttf'. Có lẽ, như Hans đã nói ** WPF ** đang cố gắng tải phông chữ vì một cái gì đó bạn đang gọi từ mã của bạn trong 'PresentationCore.dll' – Rob

1

Với dẫn từ các câu trả lời ở trên tôi đã có thể giải quyết vấn đề này bằng cách xóa các font "Microsoft Uighur Regular"

+0

Không có phông chữ nào có tên đó. Có phông chữ sử dụng thông tin văn hóa: Uighur. Tôi đã không tìm thấy cách tìm phông chữ bị lỗi nếu có. Nghe có vẻ giống như một bộ nhớ cache font wpf tham nhũng với tôi. –

2

tôi đã cùng một vấn đề. Nó biến mất sau khi tôi đã làm:

Xóa bộ đệm phông WPF và khởi động lại Visual Studio. Xóa cache: http://support.microsoft.com/kb/937135

Éric

Các vấn đề liên quan