2012-03-10 10 views
11

Mam aplikację C#/WPF Prism (v4.0), która ma ciągły problem z ładowaniem/rozdzielaniem biblioteki System.Windows.Interactivity, która jest dołączona do biblioteki Prism. Pracowałem przez trzy dni prosto próbując debugować/rozwiązać ten problem. Nauczyłem się wiele o rozdzielczości zgromadzeń .Net, ale nie miałem na razie szczęścia w moim problemie, więc pomyślałem, że zwrócę się do społeczności StackOverflow w desperackim błaganiu o pomoc. :)Błąd odniesienia zestawu pryzmatycznego: System.Windows.Interactivity

Mam moduł uruchomiony w ramach większej aplikacji Prism, która musi odwoływać się do System.Windows.Interactivity w celu dodania zachowań. Tak więc mam kontrolę użytkownika XAML określaniem przestrzeni nazw w następujący sposób:

<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"> 

A potem próbuję ustawić zachowanie na elemencie dziecka tego UserControl następująco:

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

dziwne, projekt kompiluje się dobrze, a wpisując plik skojarzony z kodem i , mogę nawet uzyskać autouzupełnianie Intellisense dla obiektów w przestrzeni nazw System.Windows.Interactivity.

Jednak w czasie wykonywania tylko, otrzymuję XamlParseException na powyższym element ListBox.

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

InnerException jest typu 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" 

... co, jak już dowiedziałem się od czytania o rozdzielczościach montażowych, zwykle sugeruje problem z rozstrzyganiem silnie nazwie zespołu zamiast po prostu niemożności znalezienia biblioteki DLL na dysku (co sugerowałby typ wyjątku).

Fusion informacji dziennika jest następujący, w tym ostrzeżenia o częściowe wiązanie do montażu w pytaniu:

=== 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. 

Co ciekawe, jeśli spojrzeć na mojego projektu zbudowanego z wykorzystaniem dezasembler IL (ildasm.exe), układ .Windows.Interactivity nie jest wymieniony w manifeście jako jeden z przywoływanych złożeń, chociaż inne odnośniki DLL Prism pokazują się w nim dobrze. Na przykład:

.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 
} 

Problem ten jest podobny do tego, o którym mowa w tej drugiej kwestii StackOverflow: Referencing the correct System.Windows.Interactivity dll from Prism application. Jednak podążam za wspomnianym zalecanym rozwiązaniem (tj. Za pomocą wersji Prism System.Windows.Interactivity), bezskutecznie. Dla zabawy, próbowałem również używać bibliotek DLL System.Windows.Interactivity, które są dostarczane razem z pakietami SDK Expression Blend 3 i 4 (oczywiście osobno), ale bez powodzenia.

Nie robię nic inaczej w tym, jak załadowałem plik System.Windows.Interactivity z tego, jak załadowałem wszystkie inne biblioteki dll, które są dostarczane z biblioteką Prism (wszystkie one znajdują się w folderze/lib w moje rozwiązanie i dodałem je za pomocą menu "Dodaj odwołanie"> "Przeglądaj" w Visual Studio 2010 i wskazując te biblioteki DLL na dysku, które znajdują się razem w jednym katalogu.)

Dowolne wskazówki, dokąd należy przejść byłby najbardziej doceniony! Wielkie dzięki.

+0

Czy istnieje wersja w GAC? Czy budujesz "Any CPU" i odwołując się do 64-bitowego w dev, ale 32-bitowe bind w czasie wykonywania? FWIW, nie mam pojęcia. –

+0

'gacutil -l' potwierdza, że ​​nie ma wersji System.Windows.Interactivity działającej w GAC. Aby odpowiedzieć na twoje pytanie, buduję z "Dowolnym procesorem" jako celem platformy w właściwościach projektu. Moja maszyna/system testujący jest 64-bitowy. Jednak nie wiem wystarczająco dużo, aby móc odpowiedzieć na twoje pytanie dotyczące wiązania 32-bitowego w czasie wykonywania. Czy możesz mi powiedzieć, jak mogę to sprawdzić? Dzięki! –

+0

Spróbuj zbudować jako x86 i zobacz, co się stanie –

Odpowiedz

32

W końcu znalazłem odpowiedź!

Podczas odwoływania się do bibliotek DLL w modułach pryzmowych.Mechanizm rozwiązywania problemów w zestawie NET szuka odwołań złożeń w folderze/bin aplikacji hostingu (tj. Z powłoką i modułem rozruchowym) zamiast z katalogu bin (zakładając, że skonfigurowałeś swoje moduły jako oddzielne projekty w rozwiązaniu, tak jak ja).

Dzięki zbiegowi okoliczności, moja aplikacja do hostingu zdała się odwoływać do wszystkich innych bibliotek DLL Prism, więc gdy moduły odniosły się do nich, po prostu znalazły je w katalogu bin aplikacji hostingowej. Jednak moja aplikacja hostingowa nigdy nie odwoływała się do System.Windows.Interactivity, więc dodanie jej tylko do mojego modułu oznaczało, że nie ma takiej biblioteki DLL, którą można znaleźć w katalogu host/bin. Plik DLL jest w rzeczywistości kopiowany do katalogu/bin modułu, ale pewne dziwactwo sposobu, w jaki rozdzielczość zespołów działa z aplikacjami Prism, oznacza, że ​​aplikacja nigdy nie sprawdza zestawów w tym folderze.

Krótko mówiąc: wspomniane złożeń w aplikacjach Prism najwyraźniej muszą znajdować się w folderze/bin aplikacji hostingowej.

Zamierzam spojrzeć na niektóre sposoby korzystania z konfiguracji, aby działała ona bardziej czysto i inteligentnie, ale sedno problemu zostało przynajmniej odkryte.

+0

Sekcja "dodaj moduły do ​​aplikacji" [tego artykułu] (http://www.codeproject.com/Articles/165376/A-Prism-4-Application-Checklist) zawiera informacje i wskazówki dotyczące zarządzania sposobami zestawów są łączone razem w aplikacje Prism (np. dziwactwa modularności). –

+0

Użyłem bibliotek dll z Expression blend SDK i przeniosłem go do wspólnego folderu Libs. Jeden z moich modułów korzystał z biblioteki dll, tak jak wspomniałeś, że dodany został odnośnik do aplikacji Shell. – mehul9595

+0

Działa jak urok! :) – StepUp

Powiązane problemy