Преобразование 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, но, вкратце, оно заключается в следующем:
- Реорганизуйте исходный код в общий проект.
- Создайте новые проекты VSIX, нацеленные на VS2022, и текущий проект VSIX останется для предыдущих версий.