Chúng ta đã xây dựng một thành phần nhỏ có một Id, tra cứu một mục trong cơ sở dữ liệu cho một assembly/namespace/class và tự động nạp một thể hiện của lớp mà chúng ta sau. Nó đã được làm việc tốt cho đến bây giờ, nhưng khi chạy mã này trong VS 2010, nó không thành công.Vấn đề với việc nạp linh hoạt các assembly trong .NET
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
If (asmb.Location = assemblyFile)) Then Return asmb
Next
Return Nothing
End Function
Vấn đề đầu tiên là, khi iterator lượt truy cập một hội động, không có asmb.Location, và một NotSupportedException được ném. Có cách nào để kiểm tra tính không được hỗ trợ của trường Vị trí mà không phải bắt ngoại lệ không?
Vấn đề thứ hai, asmb.Location đang trả lại toàn bộ đường dẫn thay vì chỉ tên tệp, có nghĩa là chức năng này không thành công mỗi lần. Nếu hàm này xác định rằng một lớp chưa được nạp, thì chúng ta sẽ thử tải nó và nhận một AccessViolationException vì lớp đã nạp và chúng ta không thể "nạp lại" nó.
Thay đổi chức năng để làm việc này:
Private Function AssemblyLoaded(ByVal assemblyFile As String) As Assembly
Dim assemblies() As Assembly = AppDomain.CurrentDomain.GetAssemblies
For Each asmb As Assembly In assemblies
Try
If (asmb.Location.EndsWith(assemblyFile)) Then Return asmb
Catch ex As NotSupportedException
Continue For
End Try
Next
Return Nothing
End Function
Nhưng nó cảm thấy bẩn. Có cách nào tốt hơn để kiểm tra xem một hội đồng đã được tải chưa và chuyển lại cho người gọi chưa? Các vấn đề trên cụ thể với .NET 4.0 hoặc Visual Studio 2010? Tôi đã không cố gắng này bên ngoài IDE vì nó đòi hỏi cấu hình khá đáng kể.
Công trình này, cảm ơn bạn. Tôi loại bỏ các. ToLower cho ngắn gọn, nhưng chúng tôi đối phó với trường hợp nhạy cảm. –