У меня есть неуправляемое приложение, которое использует сборку WPF для своего пользовательского интерфейса.
Первоначально я получал исключения, такие как:
Исключение System.IO.FileNotFoundException не обработано. Сообщение: не удалось загрузить файл или сборку. PresentationFramework ...
(Не по той причине, по которой измененная версия фреймворка приводит к: Не удалось загрузить файл или сборку PresentationFramework? ).
Я решил эту проблему, добавив строку кода на C #, которая, кажется, заставляет компилятор / среду выполнения загружать DLL:
// Refers to an arbitrary enum in PresentationFramework.Classic.dll
var dummy = Microsoft.Windows.Themes.ClassicBorderStyle.None;
и тогда я не получаю исключения во время выполнения.
В противном случае единственная ссылка на что-либо в этой DLL была в XAML. В частности:
<ResourceDictionary Source="pack://application:,,,/PresentationFramework.Classic;component/themes/Classic.xaml"/>
Но очевидно, что эта ссылка на XAML недостаточна для правильной загрузки DLL во время выполнения.
Это «фиктивное» решение хорошо, потому что оно работает, но я не понимаю, почему это необходимо, и это заставляет меня думать, что я пропустил что-то более важное.
Это правильный обходной путь? По какой причине это необходимо в первую очередь?
Всего 1 ответ
XAML и C # - два разных языка, с отдельным анализатором и компиляторами. Действительно, ранняя поддержка отладчика для ошибок времени выполнения XAML была где-то рядом с «несуществующей». А если вы получили ошибку компилятора XAML? Компилятор C # будет использовать только последний допустимый XAML-комплимент.
Хотя вы, вероятно, никогда не используете его, вполне возможно динамически загрузить дизайн XAML во время выполнения: https://blogs.msmvps.com/bsonnino/2016/07/21/loading-xaml-dynamically-part-1-loading- видовые динамически /
В этот момент компилятор не может полагаться на то, что написано в XAML во время компиляции.
Пространства имен в XAML? Они предназначены только для включения классов .NET в область действия синтаксического анализатора XAML. Они не очень важны для C # части кода.