2010-03-04 53 views
8

Tôi đang sử dụng tệp xml làm tài nguyên được nhúng để tải một XDocument. Chúng tôi đang sử dụng đoạn mã sau để tải tệp thích hợp từ hội:Tại sao Assembly.GetExecutingAssembly() trả về null?

XDocument xd = new XDocument(); 
Assembly assembly = null; 

try 
{ 
    assembly = Assembly.GetExecutingAssembly(); 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

try 
{ 
    if(assembly != null) 
    { 
     using(StreamReader sr = new 
      StreamReader(assembly.GetManifestResourceStream("assemblyPath"))) 
     { 
      using(XmlTextReader xtr = new XmlTextReader(sr)) 
      { 
       xd = XDocument.Load(xtr); 
      } 
     } 
    } 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

Vì vậy, khi các mã được triển khai, chúng tôi sẽ thường xuyên đi đến trang và không có gì sẽ được nạp từ tài liệu nhúng. Khi chúng tôi kiểm tra nhật ký sự kiện, không có lỗi. Nếu người dùng chỉ làm mới trang, nó sẽ tải tốt. Điều này đã khiến tôi nghĩ rằng, vì một lý do nào đó, assembly = Assembly.GetExecutingAssembly(); trả về số không một cách đại diện, và cách viết mã này không phải là lỗi. Vì vậy, câu hỏi của tôi là tại sao Assembly.GetExecutingAssembly(); sẽ trả về giá trị rỗng? Tôi tìm thấy một vài bài báo nói về có lỗi đôi khi với mã không được quản lý, nhưng ứng dụng này được viết bằng C# và được triển khai thông qua dự án thiết lập.

Mã ban đầu được viết mà không có mã tránh lỗi. Nó đã được thêm vào để giữ cho người dùng không nhận được màn hình lỗi. Các ngoại lệ được ghi vào nhật ký sự kiện của máy chủ.

+0

Một câu hỏi rất ngu ngốc (như tôi không thể chụp ảnh GetExecutingAssembly thất bại trong quản lý mã tinh khiết): làm lỗi xảy ra (trong bất kỳ đoạn mã khác) gây ra một mục Tôi được yêu cầu chỉ để đảm bảo rằng mã ghi sự kiện là chính xác và các ngoại lệ đó có thể bị loại trừ – Timores

+0

Xin lỗi, nên đã chỉ định nó nhiều hơn một chút. dự án tiện ích để viết ngoại lệ cho bản ghi sự kiện. Mã lệnh để làm như vậy được sử dụng trong suốt ứng dụng và công trình.Ngoài ra, mã ở trên nằm trong một phương thức được gọi trong quá trình intialization của trang – Nathan

+0

Vì vậy, sau khi thấy mọi người dường như đồng ý rằng GetExecutingAssemb ly() sẽ không trả về null, tôi quay lại và xem phần còn lại của phương thức. Sau khi tìm kiếm một số tôi tìm thấy bài viết này trên MSDN: http://msdn.microsoft.com/en-us/library/xc4235zt(VS.85).aspx. Trong đó, GetManifestResourceStream() có thể trả về null nếu không tìm thấy tài nguyên hoặc không thể truy cập được. Trả về null cho cấu trúc using() sẽ không gây ra một ngoại lệ. Vì vậy, chúng tôi sẽ triển khai điều này và xem đó có phải là thủ phạm hay không. – Nathan

Trả lời

3

Bạn đang lên lạch với sai mái chèo, GetExecutingAssembly() không bao giờ trả về null. Chứng minh nó cho chính mình bằng cách loại bỏ tất cả các mã tránh lỗi, bao gồm cả việc kiểm tra null. Việc thường xuyên bị lỗi thường là vấn đề về luồng.

1

Khi phải đối mặt với tình huống như thế này, tôi cố gắng thực sự chứng minh rằng giá trị trả lại là không. Hãy thử điều này:

try 
{ 
    assembly = Assembly.GetExecutingAssembly(); 
    Log.Write("Executing assembly is null: " + (assembly == null)) 
} 
catch(Exception ex) 
{ 
    //Write exception to server event log 
} 

tôi nghi ngờ nó sẽ luôn luôn viết "false", và cái gì khác thực sự là vấn đề - có lẽ một cái gì đó bạn không bao gồm trong đoạn mã của bạn.

7

Đây là ví dụ hoàn hảo về lý do tại sao một ý tưởng tồi tệ để ăn ngoại lệ, đặc biệt là cấp cao nhất System.Exception. Vấn đề có thể ở bất cứ đâu; nhiều khả năng là không, vấn đề thực sự là trong mã đăng nhập của bạn.

Đưa ra các ô trống catch (hoặc rethrow bên trong chúng với throw;) và xem nơi ngoại lệ là thực sự xảy ra. Và một khi bạn tìm thấy vấn đề thực sự và viết lại mã của bạn, hãy viết lại nó để chỉ bắt các ngoại lệ mà bạn thực sự là biết cách xử lý.

GetExecutingAssembly sẽ không trả lại null, dấu chấm.

5

đi đến các thuộc tính của các tập tin mà con đường được đề cập và thay đổi buildAction từ nội dung đó là một trong những mặc định để EmbeddedResource. Biên dịch lại và nó sẽ hoạt động.

1

Điều đó có thể trở về null nếu bạn đang tung ra mã của bạn từ một ứng dụng không được quản lý (ví dụ Test Á hậu NUnit): Hãy thử những điều sau đây bằng cách sử dụng giao diện điều khiển:

[Test] 
public void att() 
{ 
    Assert.NotNull(Assembly.GetExecutingAssembly()); 
} 

Thấy như bạn đã gắn thẻ nó nhúng, tôi bạn đoán bạn đang sử dụng một số loại bộ nạp khởi động, hoặc trình thông dịch để chạy ứng dụng .Net của bạn? Điều đó có lẽ sẽ không được quản lý (tức là không .Net giải thích) và do đó sẽ trả về null.

Xem tài liệu, phần "Ghi chú: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

+0

Không phải ai sẽ xem xét nó ngay bây giờ: / – chrisb

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