Я искал сейчас некоторое время и не нашел решения для конкретной проблемы.Runnable Dll, созданный с помощью WPFapplication, не находит ссылки ResourceDictionary
Сначала я разработал WPF-приложение с несколькими проектами и UserControls, используя тот же ResourceDictionary в более чем 1 из проектов. Поэтому я соерсед словарь Ресурса в одном Porject только проведение dictionary.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFGlobalResources;assembly=WPFGlobalResources"
>
<!--Here are placed some styles I use globally -->
Во многих из моих окон и UserControls я ссылка WPFGlobalResources внутри проекта и добавил
<Window.Resources> or UserControl.Resources <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/WPFGlobalResources;component/GlobalWpfResources.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>
в начале Xamls.
Пока я работаю с исполняемым приложением, все работает нормально, и все ресурсы могут быть загружены.
Теперь мне нужно было запустить Dll-версию этого приложения, чтобы зарегистрировать его в реестре Windows. Чтобы сделать это, я выбросил App.xaml из моего проекта и превратил его в классную библиотеку, так как мог найти его во многих googlesites.
Зарегистрированный там я могу вызывать его из CAD-Programm - в этой программе он использует вызов DLL MainApplication.exec 1
, которому нужны следующие методы в моем DLL-проекте, чтобы получить новый EntryPoint (я использовал для него дополнительный класс) :
public class Exec
{
public short vcExtStartUp(ref string Directory, string ExtensionName)
{ //I dont use this method
return 1;
}
public short vcExtMenuExec(ref int MenuID)
{ //this is what I need to run a WPF Application
Application app = new Application();
app.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); ;
app.Run(new MainWindow());
return 1;
}
}
Здесь мне нужен только второй метод, как вы можете видеть. В моем первоначальном проекте были некоторые ошибки, поэтому я уменьшил свою проблему настолько, насколько могу, используя только проект, содержащий WPFGlobalResources и один проект, содержащий почти пустой MainWindow, содержащий кнопку, используя стиль из словаря и ссылку на проект моего словаря.
Пока я комментирую вызов объединенного словаря в начале MainWindow.xaml, все работает нормально (конечно, у меня нет кнопки стиля). Если я пытаюсь использовать ResourceDictionary, мои сбои CAD-программы при вызове DLL и отладчик приводит меня к ошибке: (Надеюсь, что я перевел его правильно)
IOException - Additional Information: Assembly.GetEntryAssembly() returns NULL. Define Application.ResourceAssembly-Property or use the Syntax "pack://application:,,,/assemblyname;component/" to define the assembly the resource should be loaded from.
Хорошо, тогда я добавил Application.ResourceAssembly = typeof(MainWindow).Assembly;
позади новое приложение(). Теперь отладчик получает немного больше вперед, но опять остановка с ошибкой:
Exception in MainWindow.xaml linenumer12 ... -> InnerException {"File or Assembly \"WPFGlobalResources, Culture=neutral\" or a dependency of it couldn't be found. System can't find specified file.":"WPFGlobalResources, Culture=neutral"} System.Exception {System.IO.FileNotFoundException}
Я также судимое добавить
System.Uri resourceLocater = new System.Uri("/MainApplication;component/VisiDockedMainWindow.xaml", System.UriKind.Relative);
System.Windows.Application.LoadComponent(resourceLocater);
, но без успеха, по-прежнему та же ошибка.
Теперь я не могу найти решение, чтобы заставить его работать. Возможно ли, что пакет: // application ... теперь нацелен на мою CAD-программу как приложение, а не на Loaction моей DLL, где находится WPFGlobalResources.dll (и каждая другая dll)? И как я могу изменить это, я не смог найти URI для этой утилиты в MSDN.
Следующее, что я должен попробовать - это сбросить мои WPFGlobalResources и добавить стили к каждому отдельному окну/Usercontrol, но я надеюсь, что это не единственное решение ??? Производит много избыточного кода ...