System.IO.FileNotFoundException: не удалось загрузить файл или сборку

2

У меня есть приложение WPF, в котором есть 3 проекта. У меня есть главное меню, которое является фактическим EXE, DLL отчетов и DLL файлов приложений, которые являются библиотекой классов WPF. Я получаю ошибку System.IO, когда пытаюсь использовать сторонний инструмент отчетности из DLL файлов приложений. У меня есть сторонние DLL-ссылки, на которые ссылаются, и они скопированы в локальную библиотеку приложений. Все работает нормально, если я ссылаюсь на сторонний инструмент отчетности в проекте EXE, но я не хочу этого делать. Я хочу, чтобы моя DLL была автономной, поэтому кто-то другой может ссылаться на мою DLL, не добавляя ничего, кроме моей DLL. Кто-нибудь знает, что мне может понадобиться, чтобы исправить это? Спасибо

  • 2
    Возможно ли, что сторонняя DLL имеет зависимость, а FileNotFound является результатом отсутствия зависимости при развертывании?
  • 0
    @ Smudge202 - это хорошая мысль. Я всегда зацикливаюсь на этом. Ошибка говорит, что она не может загрузить одну DLL, но на самом деле это означает, что она не может найти зависимость этой одной DLL.
Теги:
wpf

3 ответа

4
Лучший ответ

Перейдите в свой выходной каталог и пройдите через всю вашу DLL, используя http://www.dependencywalker.com. Найдите недостающую dll, используйте исключение, чтобы дать вам хорошую начальную позицию.

Я не верю, что то, что вы хотите сделать, возможно. Если ваша DLL имеет зависимости от других DLL, ваша DLL нуждается в доступе к другим DLL. Вы не можете просто создать другую DLL в своей DLL.

  • 0
    это было то, что мне было интересно, если это вообще возможно. Упаковать dll внутри dll, чтобы exe, использующий родительскую dll, не знал, что в dll ...
  • 3
    На самом деле, вы можете объединить несколько сборок .NET в одну сборку, используя ILMerge.
2

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

Попробуйте изменить путь вывода (щелкните правой кнопкой мыши по объектам проекта → сборка) файлов приложений на путь bin вашего проекта exe

0

Я использовал ResourceDictionary из другой dll следующим образом:

<UserControl x:Class="DllName1.Class1" .......>
    <UserControl.Resources>
        <ResourceDictionary Source="pack://application:,,,/DllName2;component/Resources/ResourceStyleDictionaryFileName.xaml" />
    </UserControl.Resources>

    <DockPanel>
        <TextBlock Text="test" Style="{StaticResource ResourceKey=SomeResourceFromOtherDLL}" />
    </DockPanel>
</UserControl>

и я получил ту же самую ошибку, но только в первый раз, который был загружен Class1. со второго раза и дальше, он работал безупречно.

поэтому я перешел на ведение журнала сбоев сборки (Fusion), на (см. здесь) и открыл Debug- > windows → Список модулей, и я обнаружил, что DllName2 еще не загружен, но во второй раз он загружен.

Во время проб и ошибок я посоветовался с другом (user1151392), узнав, что если я использую какой-то фиктивный класс из DllName2, Dll будет загружен в первый раз.

Вот что я получил:                            

    <DockPanel>
        <!-- weird enough, but that fixed my issue -->
        <dll2alias:SomePublicClass />

        <TextBlock Text="test" Style="{StaticResource ResourceKey=SomeResourceFromOtherDLL}" />
    </DockPanel>
</UserControl>

Итак, я предполагаю, что механизм, который загружает dll для ресурсов, отличается от того, который загружает экземпляры.

Благодарим вас user1151392!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню