Свободные xaml-ссылки на версионные сборки

У меня уникальная ситуация с развитием, и я хотел бы получить информацию от других.

У меня есть ситуация, когда мне нужно загрузить свободные файлы xaml в полнофункциональное клиентское приложение. Данный свободный файл xaml может иметь ссылки на сборку, которая в настоящее время не загружена в память, поэтому указанная сборка загружается до загрузки свободного файла xaml. Свободные сборки xaml и связанные сборки хранятся на разных внутренних серверах, которые загружаются клиенту и загружаются динамически.

Свободный xaml и / или сборки зависят от версии, и, к сожалению, приложение не может быть остановлено между рендерингом xaml. v1 со сборкой. v1 с сервера A и xaml. v1 со сборкой. v2 на сервере B. Обе сборки используют одно и то же объявление пространства имен, поэтому «старые» сборки могут по-прежнему работать с «новыми» для любого заданного свободного xaml.

Проблема в том, что я не получаю ссылку на assembly.v2, если загружаю xaml.v2, который содержит ссылки на «более новые» функции в assembly.v2.

Я, очевидно, не могу выгрузить assembly.v1 из домена приложения, и я не уверен, могу ли я ссылаться на элементы в xaml, которые загружаются в другом домене приложения через маршаллинг.

Любые идеи, кроме использования разных ссылок на пространства имен?


person user34413    schedule 04.11.2008    source источник


Ответы (3)


Я предполагаю, что вы уже делаете динамическое разрешение сборки и загрузку? Если да, то вы можете попробовать подставить поддельное имя сборки вместо реального имени сборки в Xaml - затем вы можете использовать это в своем коде разрешения сборки для загрузки и возврата правильной сборки. например если исходный код Xaml:

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly"

и вы знаете, что Xaml хочет v2 MyAssembly, замените ссылку на сборку в строке Xaml перед ее синтаксическим анализом:

xmlns:myassembly="clr-namespace:MyApp.MyAssembly;assembly=MyAssembly.v2"

... затем в коде разрешения / загрузки сборки, когда вы видите бит ".v2" в конце, вы ищите и загружаете эту сборку вместо этого.

Пожалуйста, дайте мне знать, если я неправильно понял вопрос или вы в настоящее время не выполняете какое-либо нестандартное разрешение сборки - это, безусловно, будет ключевым в этой ситуации, я думаю.

person fubaar    schedule 06.02.2009

Другой вариант (при условии, что вы правильно управляете версиями своих сборок) - просто включить версию сборки в объявление ns, например:

xmlns:ns0="clr-namespace:MyCompany.MyProject.MyNameSpace; Assembly=MyCompany.MyProject, Version=1.0.0.0"
person Greg Bacchus    schedule 16.05.2009
comment
Когда я пробую это, появляется сообщение Неизвестная ошибка сборки, clr-namespace: blah; assembly = assembly.blah, Version = 1.3.0.0 'URI сопоставления недействителен. Не могли бы вы дать ссылку на ссылку MSDN по этому поводу? - person James Schek; 25.01.2011
comment
Извините, это я передал информацию, на самом деле не пробуя ее. Я прочитал msdn.microsoft.com/en-us/library/ms747086.aspx, в котором указано, что часть после сборки = была AssemblyName (со следующей ссылкой) (следующий комментарий) - person Greg Bacchus; 09.02.2011
comment
msdn.microsoft.com/en-us/library/ здесь говорится, что формат отображаемого имени AssemblyName представляет собой строку Unicode с разделителями-запятыми, которая начинается с имени, а именно: Name ‹, Culture = CultureInfo› ‹, Version = Major.Minor.Build.Revision› ‹, StrongName› ‹, PublicKeyToken› '\ 0' Итак, моя ошибка. Надо было сначала проверить это. Я просто протестировал его сейчас и получил такой же результат, как и вы. - person Greg Bacchus; 09.02.2011
comment
Я когда-либо сталкивался с этой проблемой, и причина в том, что ... пробел перед пространством имен. - person Elaine; 27.08.2012

Я не подтвердил, будет ли это работать, но я верю, что может. Вы можете использовать XmlnsDefinitionAttribute (на уровне сборки). Например.

Сборка V1 -> AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v1", "MyCompany.MyProject" )]

Сборка V2 -> AssemblyInfo.cs

[assembly: XmlnsDefinition( "http://schema.mycompany.com/myproject/v2", "MyCompany.MyProject" )]

А затем в xaml:

xmlns:myassembly="http://schema.mycompany.com/myproject/v2"
person Greg Bacchus    schedule 16.05.2009
comment
Я не уверен, что вы можете использовать здесь разные пространства имен. Обе сборки используют одно и то же объявление пространства имен, поэтому старые сборки могут по-прежнему работать с более новыми для любого данного свободного xaml. - person treehouse; 16.05.2009