Зачем мне нужна фиктивная строка кода для загрузки PresentationFramework?

У меня есть неуправляемое приложение, которое использует сборку 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 # части кода.


Есть идеи?

10000