У меня есть приложение WPF, в котором есть 3 проекта. У меня есть главное меню, которое является фактическим EXE, DLL отчетов и DLL файлов приложений, которые являются библиотекой классов WPF. Я получаю ошибку System.IO, когда пытаюсь использовать сторонний инструмент отчетности из DLL файлов приложений. У меня есть сторонние DLL-ссылки, на которые ссылаются, и они скопированы в локальную библиотеку приложений. Все работает нормально, если я ссылаюсь на сторонний инструмент отчетности в проекте EXE, но я не хочу этого делать. Я хочу, чтобы моя DLL была автономной, поэтому кто-то другой может ссылаться на мою DLL, не добавляя ничего, кроме моей DLL. Кто-нибудь знает, что мне может понадобиться, чтобы исправить это? Спасибо
Перейдите в свой выходной каталог и пройдите через всю вашу DLL, используя http://www.dependencywalker.com. Найдите недостающую dll, используйте исключение, чтобы дать вам хорошую начальную позицию.
Я не верю, что то, что вы хотите сделать, возможно. Если ваша DLL имеет зависимости от других DLL, ваша DLL нуждается в доступе к другим DLL. Вы не можете просто создать другую DLL в своей DLL.
Скопировать локально означает, что он будет скопирован в папку bin текущего проекта, которая в случае файлов приложений затем скопирует его в папку bin файлов приложений, которая не является тем, что вы хотите.
Попробуйте изменить путь вывода (щелкните правой кнопкой мыши по объектам проекта → сборка) файлов приложений на путь bin вашего проекта exe
Я использовал 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!