Некорректно работают ссылки на WPF контролы в другой сборке

Автор Тема: Некорректно работают ссылки на WPF контролы в другой сборке  (Прочитано 9199 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Здравствуйте!
Снова столкнулся с проблемой в AutoCAD. У меня есть библиотечная сборка, которая содержит несколько часто используемых WPF контролов. При необходимости я ее подключаю как ссылку и использую эти контролы в диалоговых окнах в приложениях под AutoCAD/Civil 3D.
Порядок подключения прост:
1. Добавляю DLL как ссылочную
2. В XAML коде диалога добавляю пространство имен моей библиотечной сборки
3. Добавляю библиотечные контролы в нужное место.
Все это хорошо работало, пока мне не понадобилось подкорректировать библиотечную сборку. После изменения, я задал ей новый номер версии. Полученную DLL я просто добавил в инсталлятор, без перекомпиляции тех приложений, которые на нее ссылаются. И оказалось, что AutoCAD перестал их воспринимать! Выдает исключение загрузки сборки. При этом, если вне AutoCAD сделать то же самое - проблем никаких нет. К примеру, WPF приложение спокойно воспринимает библиотечную DLL, не смотря на изменение ее версии.
Еще одна особенность. Даже если версия не изменялась, библиотечную DLL надо явно подгрузить в AutoCAD с помощью NETLOAD. Сам он не в состоянии найти ссылочную DLL рядом с DLL приложения! Но это не критично, я и так их загружаю принудительно. А вот то, что при каждом изменении версии библиотечной DLL нужно пересобирать все другие DLL, просто убивает всю идею использования библиотеки!
Для пояснения ситуации, я сделал тестовый проект и записал видео. Буду признателен за идеи, как с этим бороться.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
А в проекте в свойствах ссылки на эту библиотеку установлено значение "Конкретная версия" в значение False?

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, это ничего не меняет

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Да, это ничего не меняет
У меня в этом случае:
1. Стоит значение "Конкретная версия" в False
2. "Копировать локально" в False
3. Загрузка всех вспомогательных библиотек в домен автокада обязательно в принудительной форме через Assembly.LoadFrom() и обязательно до первого их вызова
Никаких проблем не наблюдается при изменении версий вспомогательных сборок

Остается еще вариант, что где-то принудительно прописана версия библиотеки. Либо в ссылке на нее в xaml, либо при использовании ее ресурсов с помощью URI pack

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Никаких проблем не наблюдается при изменении версий вспомогательных сборок
Версия файла и сборки точно изменяется?

И еще одно уточнение. Речь идет именно о механизме подгрузки стороннего WPF-контрола таким способом (строки 7-8):
Код - XML [Выбрать]
  1. <Window x:Class="WpfRefAcadTest.TestWindow"
  2.             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  5.             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  6.             SizeToContent="WidthAndHeight"
  7.             xmlns:lib="clr-namespace:WpfControlsLib;assembly=WpfControlsLib">
  8.     <lib:MyControl Margin="50"></lib:MyControl>
  9. </Window>

Цитировать
Остается еще вариант, что где-то принудительно прописана версия библиотеки. Либо в ссылке на нее в xaml, либо при использовании ее ресурсов с помощью URI pack
Так ведь я готовый проект приложил. Если в нем что-то подобное обнаружится, я сильно удивлюсь.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Версия файла и сборки точно изменяется?
Так ведь я готовый проект приложил. Если в нем что-то подобное обнаружится, я сильно удивлюсь.
Никаких проблем не наблюдается при изменении версий вспомогательных сборок
Я имел ввиду не ваш проект, а свой ))
Но! В своем я не пробовал использовать UserControl из другой сборки. Поэтому попробовал ваш проект и да - проблема явно наблюдается! У меня тоже ничего не получилось из явного. Остается только гуглить варианты, но вопрос достаточно специфический и очень сложно что-то подобное найти

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Итак, нашел решение. Хотя мне оно не нравится, но оно решает эту проблему
Меняем xaml:
Код - XML [Выбрать]
  1. <Window x:Class="WpfRefAcadTest.TestWindow"
  2.        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.        SizeToContent="WidthAndHeight">
  5.     <Grid x:Name="MainGrid">
  6.     <!--<lib:MyControl Margin="50"></lib:MyControl>-->
  7.     </Grid>
  8. </Window>
Меняем Code Behind:
Код - C# [Выбрать]
  1. using System;
  2. using System.Reflection;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5.  
  6. namespace WpfRefAcadTest
  7. {
  8.     public partial class TestWindow : Window
  9.     {
  10.         public TestWindow()
  11.         {
  12.             UserControl myControl = null;
  13.             Assembly asm = Assembly.LoadFile(@"E:\WpfRefTest\WpfRefTest\Binaries\WpfControlsLib.dll");
  14.             Type[] tlist = asm.GetTypes();
  15.             foreach (Type t in tlist)
  16.             {
  17.                 if (t.Name == "MyControl")
  18.                 {
  19.                     myControl = Activator.CreateInstance(t) as UserControl;
  20.                     break;
  21.                 }
  22.             }
  23.             InitializeComponent();
  24.             this.MainGrid.Children.Add(myControl);
  25.         }
  26.     }
  27. }
Проблема конечно решается, но разрабатывать окно становится просто невозможно.

Думаю, нужно еще варианты поискать

Оффлайн Дмитрий ЗагорулькинАвтор темы

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Чем так делать, проще уж просто в каждый проект продублировать нужные контролы. Наверное, так и сделаю.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Чем так делать, проще уж просто в каждый проект продублировать нужные контролы. Наверное, так и сделаю.
+100500 ))