У меня есть приложение С#/WPF Prism (v4.0), которое имеет постоянную проблему при загрузке/разрешении dll System.Windows.Interactivity, которая поставляется с библиотекой Prism. Я работаю три дня подряд, пытаясь отладить/решить эту проблему. Я узнал тонну о разрешении сборки .Net, но до сих пор не удался по моей проблеме, поэтому я подумал, что обрадуюсь к сообществу StackOverflow в отчаянной просьбе о помощи.:)
У меня есть модуль, работающий как часть более крупного приложения Prism, которому необходимо ссылаться на System.Windows.Interactivity, чтобы добавить поведение. Таким образом, у меня есть пользовательский элемент управления XAML, определяющий пространство имен следующим образом:
<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">
И затем я пытаюсь установить поведение дочернего элемента этого UserControl следующим образом:
<ListBox Name="myListBox">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SomeCommandOrOther}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
Как ни странно, проект строит отлично, и при вводе в файл ассоциированного кода, и я даже могу получить автоматическое завершение Intellisense для объектов в пространстве имен System.Windows.Interactivity.
Однако, только во время выполнения, я получаю исключение XamlParseException в элементе выше списка 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 имеет тип 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"
... который, как я узнал из чтения о разрешениях сборки, обычно предлагает проблему решения сильно названной сборки, а не просто неспособность найти dll на диске (как подсказывает тип исключения).
Информация журнала Fusion следующая, включая предупреждение о частичном связывании для рассматриваемой сборки:
=== 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.
Интересно, что если я посмотрю на свой построенный проект с использованием дизассемблера IL (ildasm.exe), System.Windows.Interactivity не отображается в манифесте как одна из ссылочных ассемблеров, хотя другие ссылочные DLL-объекты Prism отображаются там только хорошо. Например:
.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
}
Эта проблема аналогична той, что упоминалась в этом другом вопросе StackOverflow: Ссылка на правильную dll System.Windows.Interactivity из приложения Prism. Тем не менее, я следую указанному там предписанному решению (т.е. Используя версию Prism System.Windows.Interactivity), но безрезультатно. Просто для удовольствия я также попытался использовать DLL System.Windows.Interactivity, которые поставляются с пакетами Expression Blend 3 и 4 SDK (отдельно, конечно), но не повезло с ними.
Я не делаю ничего по-другому в том, как я загрузил dll System.Windows.Interactivity из того, как я загрузил все другие библиотеки DLL, которые поставляются с библиотекой Prism (все они находятся в папке /lib в моем решение, и я добавил их, используя меню "Добавить ссылку" > "Обзор" в Visual Studio 2010 и указав на эти DLL на диске, все вместе в одном каталоге.)
Любые выводы о том, куда обратиться дальше, будут очень благодарны! Большое спасибо.