Я использую 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:
Минимальное решение для воспроизведениячерез GitHub
Это нормально?
Это ошибка в компиляторе?
Очевидно, что во время выполнения ClassLibary1 зависит от ClassLibary2, так почему же ссылка не скомпилирована вметаданные ClassLibrary1?