Почему ссылка на сборку удаляется из скомпилированной сборки, если на нее ссылаются только из xaml - PullRequest
0 голосов
/ 22 октября 2019

Я использую Visual Studio 2017 (15.9.7) Targeting .Net Framework 4.7.1.
Я столкнулся с проблемой отсутствия транзитивных ссылок, скопированных в мою выходную папку.
Код компилируется без проблем.
Я исследовал проблему и обнаружил, что основной причиной является отсутствующая ссылка в скомпилированной сборке.

Я разобрал проблему, и вот что я нашел:

У меня есть 2 библиотеки классов:

  • ClassLibrary1 имеет xaml UserControl, который ссылается на BitmapImage из ClassLibrary2:
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:media="clr-namespace:ClassLibrary2;assembly=ClassLibrary2"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Image Source="{x:Static media:MediaResourceImages.Autofocus_16}" />
</UserControl>
  • ClassLibrary2 имеетФайл ресурсов png, скомпилированный в нем, и открытое статическое поле BitmapImage только для чтения в общедоступном статическом классе, созданное из png:
using System;
using System.Windows.Media.Imaging;

namespace ClassLibrary2
{
    public static class MediaResourceUris
    {
        public const string Autofocus_16 = "pack://application:,,,/ClassLibrary2;component/Resources/Autofocus_16.png";
    }

    public static class MediaResourceImages
    {
        public static readonly BitmapImage Autofocus_16 = new BitmapImage(new Uri(MediaResourceUris.Autofocus_16));
    }
}

После успешной компиляции ILSpy показывает, что ClassLibrary1 не имеет ссылки на ClassLibrary2даже если baml ссылается на поле из ClassLibrary2:

ILSpy screenshot

Минимальное решение для воспроизведениячерез GitHub

Это нормально?
Это ошибка в компиляторе?
Очевидно, что во время выполнения ClassLibary1 зависит от ClassLibary2, так почему же ссылка не скомпилирована вметаданные ClassLibrary1?

1 Ответ

0 голосов
/ 23 октября 2019

Это известная проблема XAML. Компилятор не копирует ссылки, которые используются только в разметке XAML.

Обходной путь прост. Установите для свойства Copy Local для сборки ClassLibrary2 значение True в проекте библиотеки ClassLibrary1 или укажите программный тип в ClassLibrary2 из ClassLibrary1 в C #.

...