2010-10-15 27 views
6

Tôi có một VS Add-In đang sử dụng một BinaryFormatter để deserialize một đối tượng. Để giải quyết kiểu của đối tượng này, nó gọi Assembly.Load (objectTypeFullName) nhưng nó kích hoạt một ngoại lệ vì Assembly.Load không thể tìm thấy assembly ở bất kỳ nơi nào nó đang tìm kiếm. Các hội đồng nhất định là anh chị em để lắp ráp bổ sung, nhưng có vẻ như Assembly.Load() không thể tìm thấy nó ở đó.Làm thế nào để xác định nơi Assembly.Load() tìm kiếm cho hội đồng?

Một giải pháp có thể là xác định nơi Assembly.Load sẽ tìm kiếm các hội đồng.

Tôi nên làm gì?

PS: Tôi đang cố gắng không để lắp ráp này trên GAC vì tôi sẽ cần phải cập nhật nó mỗi khi tôi biên dịch lại lắp ráp.

Trả lời

4

Bạn có thể sử dụng AppDomainSetup.PrivateBinPath để thêm đường dẫn tìm kiếm riêng bổ sung. Điều này có thể được truy xuất qua AppDomain.SetupInformation.

Tùy chọn khác là đăng ký AppDomain.AssemblyResolve để ghi đè hành vi khi không tìm thấy lắp ráp của bạn.

+0

Cảm ơn Reed. Một số lưu ý: Mặc dù AppDomain.AppendPrivatePath không được chấp thuận với AppDomainSetup.PrivateBinPath, nhưng tôi chỉ có thể sử dụng lệnh đầu tiên. AppDomainSetup.PrivateBinPath vẫn còn null sau khi tôi thay đổi nó. AppDomain.AppendPrivatePath cho phép tôi thêm bất kỳ đường dẫn nào LÀ TRẺ EM của AppDomain.BaseDirectory, mà trong nhiều trường hợp là đủ, không phải trong tôi vì BaseDirectory của tôi là thư mục DevEnv. Các giải pháp khác, AppDomain.AssemblyResolve là đủ tốt. Ghi chú: Sự kiện này chỉ được gọi khi .NET không thể giải quyết việc lắp ráp cho chính nó. Nếu tất cả các trình xử lý trả về null, một ngoại lệ được ném –

3

Nếu bạn chỉ đang cố gắng xác định nơi trình tải lắp ráp đang cố gắng tải dll của bạn từ, tôi khuyên bạn nên bật nhật ký tổng hợp. Làm như vậy sẽ cho phép bạn để có được sản lượng đó sẽ cho bạn thấy mỗi con đường đã được kiểm tra cho dll tương ứng.

MSDN article về cách định cấu hình nhật ký tổng hợp và bài viết hữu ích theo số Suzanne Cook về cách gỡ lỗi tải lỗi. Nếu bạn bật LogFailures và bạn chỉ nên nhận đầu ra cho các hội đồng không tải được.

+0

Rất thú vị nhật ký tổng hợp này, tôi đang đọc bài viết. Cảm ơn. –

4

Dưới đây là một đoạn mã thể hiện như thế nào AssemblyResolve có thể được sử dụng để giải quyết lắp ráp của bạn (như mỗi câu trả lời Reed Copey của):

// register to listen to all assembly resolving attempts: 
AppDomain currentDomain = AppDomain.CurrentDomain; 
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler); 


// Check whether the desired assembly is already loaded 
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) { 
    string desiredAssmebly = args.Name; 
    if (desiredAssembly.Equals("NameUsedToLoadMyAssembly")){ 
     return Assembly.LoadFrom(myAssemblyPath); 
    } 

    return null; 
    } 

Ngoài ra, lưu ý rằng trang MSDN cho AssemblyResolve khẳng định rằng:

Bắt đầu với .NET Framework phiên bản 4, thuộc tính ResolveEventArgs.RequestingAssembly trả về assembly rằng yêu cầu tải lắp ráp có thể không được giải quyết ...

Điều này có thể được sử dụng nếu bạn biết vị trí lắp ráp của bạn so với vị trí lắp ráp yêu cầu.

+0

Hershi, cảm ơn +1. Trên thực tế, giải pháp của bạn hóa ra là giải pháp tôi đã sử dụng và tôi đã sử dụng đoạn mã của bạn. Tôi đã đánh dấu câu trả lời của Reed như được chấp nhận vì nó hoàn chỉnh hơn. Cảm ơn bạn anyway. –

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