Преобразование ImageMoniker в WPF BitmapSource в VS2022

Я разрабатываю расширение для Visual Studio, которое включает представление XAML внутри окна VS. Я хочу, чтобы расширение выглядело и ощущалось как собственный пользовательский интерфейс. Расширение в настоящее время работает и отлично работает в VS2017 и VS2019 с использованием следующего кода для преобразования моникера в WPF BitmapSource, который можно использовать непосредственно из XAML:

      public static BitmapSource GetIconForImageMoniker(ImageMoniker? imageMoniker, int sizeX, int sizeY)
{
    if (imageMoniker == null)
    {
        return null;
    }

    IVsImageService2 vsIconService = ServiceProvider.GlobalProvider.GetService(typeof(SVsImageService)) as IVsImageService2;

    if (vsIconService == null)
    {
        return null;
    }

    ImageAttributes imageAttributes = new ImageAttributes
    {
        Flags = (uint)_ImageAttributesFlags.IAF_RequiredFlags,
        ImageType = (uint)_UIImageType.IT_Bitmap,
        Format = (uint)_UIDataFormat.DF_WPF,
        LogicalHeight = sizeY,
        LogicalWidth = sizeX,
        StructSize = Marshal.SizeOf(typeof(ImageAttributes))
    };

    IVsUIObject result = vsIconService.GetImage(imageMoniker.Value, imageAttributes);

    object data;
    result.get_Data(out data);
    BitmapSource glyph = data as BitmapSource;

    if (glyph != null)
    {
        glyph.Freeze();
    }

    return glyph;
}

Как уже упоминалось, это отлично работает в VS2017 и VS2019. Теперь я хочу, чтобы это работало и в VS2022. Расширение отображается внутри VS2022, но значки больше не отображаются.

Кто-нибудь знает, как заставить эту работу работать как в VS2017, так и в 19 и 22?

1 ответ

Решение

Это вызвано изменениями в библиотеках взаимодействия в VS2022. А именно, все они были объединены в единую библиотеку (подробности можно увидеть здесь ).

Это нарушает совместимость с предыдущими версиями Visual Studio. Есть руководство по переносу расширений на VS2022, но, вкратце, оно заключается в следующем:

  1. Реорганизуйте исходный код в общий проект.
  2. Создайте новые проекты VSIX, нацеленные на VS2022, и текущий проект VSIX останется для предыдущих версий.
Другие вопросы по тегам