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.
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. –
'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! –
Spróbuj zbudować jako x86 i zobacz, co się stanie –