2012-03-10 37 views
11

Tôi có ứng dụng C#/WPF Prism (v4.0) có vấn đề liên tục tải/giải quyết tệp System.Windows.Interactivity đi kèm với thư viện Prism. Tôi đã làm việc trong ba ngày liên tục cố gắng để gỡ lỗi/giải quyết vấn đề này. Tôi đã học được một tấn về độ phân giải lắp ráp .Net, nhưng không có may mắn cho đến nay về vấn đề của tôi, vì vậy tôi nghĩ rằng tôi muốn chuyển sang cộng đồng StackOverflow trong một lời bào chữa tuyệt vọng để được giúp đỡ. :)Lỗi tham chiếu lắp ráp lăng kính: System.Windows.Interactivity

Tôi có một mô-đun đang chạy như một phần của ứng dụng Prism lớn hơn, cần tham khảo System.Windows.Interactivity để thêm hành vi. Vì vậy, tôi có một điều khiển người dùng XAML xác định không gian tên như sau:

<UserControl x:Class="MyApp.Modules.SourcesModule.myView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"> 

Và sau đó tôi đang cố gắng để thiết lập một hành vi trên một phần tử con của UserControl đó như sau:

<ListBox Name="myListBox"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <i:InvokeCommandAction Command="{Binding SomeCommandOrOther}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

Nhưng kỳ lạ, dự án xây dựng tốt, và khi gõ vào tập tin mã-liên kết phía sau và tôi thậm chí có thể tự động hoàn thành Intellisense cho các đối tượng trong không gian tên System.Windows.Interactivity.

Tuy nhiên, khi chạy chỉ, tôi nhận được XamlParseException trên phần tử ListBox ở trên.

Could not load file or assembly 'System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 

Các InnerException là loại System.IO.FileNotFoundException

"Could not load file or assembly 'System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.":"System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35" 

... trong đó, như tôi đã học được từ việc đọc về độ phân giải lắp ráp, thường cho thấy một vấn đề giải quyết một lắp ráp mạnh mẽ tên thay vì chỉ đơn thuần là không có khả năng tìm thấy dll trên đĩa (như loại ngoại lệ sẽ gợi ý).

thông tin đăng nhập

Fusion là như sau, trong đó có cảnh báo về một phần ràng buộc để lắp ráp trong câu hỏi:

=== Pre-bind state information === 
LOG: User = aricebo-array\me 
LOG: DisplayName = System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35 
(Partial) 
WRN: Partial binding information was supplied for an assembly: 
WRN: Assembly Name: System.Windows.Interactivity, PublicKeyToken=31bf3856ad364e35 | Domain ID: 1 
WRN: A partial bind occurs when only part of the assembly display name is provided. 
WRN: This might result in the binder loading an incorrect assembly. 
WRN: It is recommended to provide a fully specified textual identity for the assembly, 
WRN: that consists of the simple name, version, culture, and public key token. 
WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue. 
LOG: Appbase = file:///C:/Users/me/Documents/Development Projects/Desktop apps/Prism/MyApp/Src/MyApp/bin/Debug/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35. 
=== 
LOG: This bind starts in default load context. 
LOG: No application configuration file found. 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Users/me/Documents/Development Projects/Desktop apps/Prism/MyApp/Src/MyApp/bin/Debug/System.Windows.Interactivity.DLL. 
LOG: Attempting download of new URL file:///C:/Users/me/Documents/Development Projects/Desktop apps/Prism/MyApp/Src/MyApp/bin/Debug/System.Windows.Interactivity/System.Windows.Interactivity.DLL. 
LOG: Attempting download of new URL file:///C:/Users/me/Documents/Development Projects/Desktop apps/Prism/MyApp/Src/MyApp/bin/Debug/System.Windows.Interactivity.EXE. 
LOG: Attempting download of new URL file:///C:/Users/me/Documents/Development Projects/Desktop apps/Prism/MyApp/Src/MyApp/bin/Debug/System.Windows.Interactivity/System.Windows.Interactivity.EXE. 

Điều thú vị là, nếu tôi nhìn vào dự án xây dựng của tôi bằng cách sử dụng disassembler IL (Ildasm.exe), Hệ thống .Windows.Interactivity không được liệt kê trong tệp kê khai như là một trong các assembly được tham chiếu, mặc dù các tệp tham chiếu Prism khác được hiển thị ở đó tốt. Ví dụ:

.assembly extern Microsoft.Practices.Prism 
{ 
    .publickeytoken = (31 BF 38 56 AD 36 4E 35)       // 1.8V.6N5 
    .ver 4:0:0:0 
} 
.assembly extern Microsoft.Practices.Unity 
{ 
    .publickeytoken = (31 BF 38 56 AD 36 4E 35)       // 1.8V.6N5 
    .ver 2:0:414:0 
} 

Sự cố này tương tự như vấn đề được đề cập trong câu hỏi StackOverflow khác: Referencing the correct System.Windows.Interactivity dll from Prism application. Tuy nhiên, tôi đang theo các giải pháp được quy định được đề cập ở đó (tức là, bằng cách sử dụng phiên bản Prism của System.Windows.Interactivity), không có kết quả. Chỉ cần cho vui, tôi cũng đã thử bằng cách sử dụng các System.Windows.Interactivity dlls đi kèm với cả hai Expression Blend 3 và 4 SDK (riêng biệt của khóa học), nhưng không có may mắn với những người hoặc.

Tôi không làm bất cứ điều gì khác biệt trong cách tôi tải tệp System.Windows.Interactivity từ cách tôi đã tải tất cả các tệp dll khác đi kèm với thư viện Prism (tất cả đều nằm trong thư mục/lib trong giải pháp của tôi, và tôi đã thêm chúng bằng cách sử dụng trình đơn "Thêm tham chiếu"> "Duyệt" trong Visual Studio 2010 và trỏ đến các dll trên đĩa đang ngồi cùng nhau trong một thư mục.)

Bất kỳ khách hàng tiềm năng nào sẽ đến nơi tiếp theo sẽ được đánh giá cao nhất! Cảm ơn nhiều.

+0

Có phiên bản nào trong GAC không? Bạn đang xây dựng 'CPU bất kỳ' và tham chiếu 64 bit tại dev, nhưng một liên kết 32 bit tại thời gian chạy? FWIW, tôi không có manh mối. –

+0

'gacutil -l' xác nhận rằng không có phiên bản System.Windows.Interactivity nào đang chạy trong GAC. Để trả lời câu hỏi của bạn, tôi đang xây dựng với "CPU bất kỳ" làm mục tiêu nền tảng trong thuộc tính dự án. Máy tính/hệ điều hành thử nghiệm của tôi là 64 bit. Tuy nhiên, tôi không biết đủ để có thể trả lời câu hỏi của bạn về liên kết 32 bit lúc chạy. Bạn có thể cho tôi biết làm thế nào tôi có thể kiểm tra điều đó? Cảm ơn! –

+0

Hãy thử xây dựng như x86 và xem điều gì xảy ra –

Trả lời

32

Cuối cùng, tôi đã tìm thấy câu trả lời!

Khi các tệp DLL trong mô-đun Prism được tham chiếu, thì.Cơ chế phân giải lắp ráp NET tìm kiếm các hội đồng được tham chiếu trong thư mục/bin của ứng dụng lưu trữ (ví dụ, một với Shell và Bootstrapper) thay vì trong thư mục bin của mô-đun (giả sử bạn đã thiết lập các mô-đun của mình riêng biệt các dự án trong giải pháp, như tôi có).

Bởi trùng hợp ngẫu nhiên, ứng dụng lưu trữ của tôi đã xảy ra để tham khảo tất cả các tệp Prism DLL khác, vì vậy khi các mô-đun tham chiếu, nó chỉ tìm thấy chúng trong thư mục bin của ứng dụng lưu trữ. Tuy nhiên, ứng dụng lưu trữ của tôi không bao giờ tham chiếu System.Windows.Interactivity, do đó, thêm nó chỉ vào mô-đun của tôi có nghĩa là không có DLL như vậy được tìm thấy trong thư mục ứng dụng lưu trữ/bin. Thực ra, DLL được sao chép vào thư mục/bin của mô-đun, nhưng một số cách phân giải lắp ráp làm việc với các ứng dụng Prism có nghĩa là ứng dụng không bao giờ kiểm tra các assembly trong thư mục đó.

Vì vậy, trong ngắn hạn: các hội đồng được tham chiếu trong các ứng dụng Prism dường như cần phải nằm trong thư mục/bin của ứng dụng lưu trữ.

Tôi sẽ xem xét một số phương tiện sử dụng cấu hình để làm cho công việc này rõ ràng hơn và thông minh hơn, nhưng cốt lõi của vấn đề ít nhất đã được phát hiện.

+0

Phần "thêm mô-đun vào ứng dụng" của [bài viết này] (http://www.codeproject.com/Articles/165376/A-Prism-4-Application-Checklist) cung cấp một số thông tin chi tiết và mẹo về cách quản lý các cách thức hội đồng được đan với nhau trong các ứng dụng Prism (ví dụ, các quirks của mô đun). –

+0

Tôi sử dụng dll's từ Expression blend SDK và chuyển nó vào thư mục Libs chung. Một trong những mô-đun của tôi đã sử dụng dll vì vậy khi bạn đề cập thêm tham chiếu đến ứng dụng Shell đã làm việc. – mehul9595

+0

Nó hoạt động như một nét duyên dáng! :) – StepUp

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