Почему разработчику WPF не удается загрузить библиотеки, которые обращаются к неуправляемым библиотекам DLL?

#c# #wpf #visual-studio-2008 #c -cli

#c# #wpf #visual-studio-2008 #c -cli

Вопрос:

Я использую Visual Studio 2008, .NET 3.5 SP1, и у меня есть тестовое приложение со следующими модулями:

  1. C DLL
  2. C / CLI DLL, которая использует # 1
  3. приложение C # WPF, использующее # 2

Когда я пытаюсь использовать классы из # 2 в качестве ресурсов в WPF XAML, дизайнер не позволяет мне:

 <Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:lib1="clr-namespace:ClassLibrary1;assembly=ClassLibrary1" <- ERROR 
  

Ошибка: «Сборка ‘ClassLibrary1’ не найдена. Убедитесь, что у вас не пропущена ссылка на сборку. Кроме того, убедитесь, что ваш проект и все сборки, на которые ссылаются, были собраны.»

Но когда я использую класс из C / CLI DLL в коде за главным окном приложения, все работает нормально. Class1 создан, и в его конструкторе он обращается к C DLL, никаких проблем.

 using ClassLibrary1;

...

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        //use in code-behind
        Class1 tmp = new Class1();
        tmp.FirstName = "foo";
        Title = tmp.FirstName;
    }
}
  

Если я изменяю сборку C / CLI, удаляю ее вызов в C DLL и перестраиваю все заново, разработчик перестает жаловаться и загружает сборку C / CLI без жалоб.

Я подозреваю, что эта проблема как-то связана с тем, где разработчик WPF ищет динамические библиотеки.

Комментарии:

1. Я не уверен в обходном пути, но я полагаю, что VS / WPF Designer копирует сборки во временное местоположение и загружает их оттуда. Так что, вероятно, это не копирование вашей библиотеки DLL C .

2. Я думаю, вы очень близки к истине, но не совсем. Сборки (даже неуправляемые) фактически скопированы, но, как говорит Рик ниже, разработчик WPF не может их найти, если они не находятся где-то в системном пути.

Ответ №1:

Поскольку дизайнер Visual Studio копирует ваши сборки во временное расположение, но не копирует ваши неуправляемые зависимости, вы можете столкнуться с этой проблемой.

Самое простое решение, хотя и не идеальное, — добавить папку, содержащую ваши неуправляемые зависимости, в PATH переменную окружения, а затем начать DevEnv.exe с этого PATH .

Вы можете сделать это либо с помощью:

  • Добавление папки в системные переменные среды с помощью Компьютер -> Свойства
  • Использование командного файла, который задает путь, а затем запускает DevEnv

Проблема с этим решением заключается в том, что при перестроении неуправляемых зависимостей Visual Studio имеет тенденцию «зависать» на них или не использовать новые, и поэтому в конечном итоге вам нужно выйти и перезапустить Visual Studio после использования конструктора, чтобы должным образом полностью все перестроить, и это может быть немного болезненно.

Комментарии:

1. Да, должно быть, так: дизайнер находит мои библиотеки DLL, только если они находятся по системному пути. Если я скопирую свою библиотеку в папку system32, как предлагается здесь ( social.msdn.microsoft.com/Forums/en/vswpfdesigner/thread /… ), вместо того, чтобы в папку вывода, дизайнер находит ее. Поэтому я уверен, что ваше решение сработает. Однако я действительно не горю желанием иметь дело с проблемой устаревших DLL, которую вы описываете. Блин.

2. @Matthew: В целях проектирования вас может вообще не волновать, обновлена ли неуправляемая DLL. Это могло быть недельной давности. Поэкспериментируйте, чтобы найти то, что работает лучше всего.

Ответ №2:

Не настоящее решение, но иногда это помогает: перестройте с использованием «AnyCPU» (не «x64», потому что дизайнер — это 32-разрядный процесс) и в режиме «Release» закройте и повторно откройте Visual Studio. И, да: это очень раздражает…