2017-02-16 11 views
0

Я искал сейчас некоторое время и не нашел решения для конкретной проблемы.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, но я надеюсь, что это не единственное решение ??? Производит много избыточного кода ...

ответ

0

Хорошо, после попытки много я тем временем нашел решение:

Дело в том, что при выполнении XAML-кода в MainWindow, ссылки, кажется, не должны быть загружены. Решение просто добавляет:

Assembly resAssembly = Assembly.Load("WPFGlobalResources"); 

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

Интересный совет: в этом случае даже лучше оставить WPF-приложение без каких-либо изменений (все еще исполняемый с материалом App.xaml) и добавить дополнительный Classlibrary-Project для создания dll. И тогда вы можете добавить класс запуска вашего WPF Заявке (конечно, вы должны ссылаться на WPF-Projekt и ResourceDictionary-Projekt первый):

public class Exec 
{ 

    public short vcExtStartUp(ref string Directory, string ExtensionName) 
    { 
     return 1; 

    } 

    public short vcExtMenuExec(ref int MenuID) 
    { 
     Thread thread = new Thread(() => 
     { 
      WpfTestAppl.App app = new WpfTestAppl.App(); 

      // Loading of ResourceAssemblys     
      Assembly resAssembly = Assembly.Load("WPFGlobalResources"); 


      app.Run(new WpfTestAppl.MainWindow()); 

     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 

     return 1; 
    } 
} 

И теперь он, наконец, работает :-)