Как я могу предварительно определить, вызовет ли доступ к свойству AccessViolation?
У меня есть метод в Rubberduck (надстройка VBE в процессе), который назначает рисунок и маску для CommandBarControl
(Кнопка). Он хорошо работает при добавлении изображений в VBE Excel, Word и т. Д., Но не удается с нарушением доступа при добавлении изображений в SolidWorks VBE.
public static void SetButtonImage(CommandBarButton button, Image image, Image mask)
{
button.FaceId = 0;
if (image == null || mask == null)
{
return;
}
try
{
button.Picture = AxHostConverter.ImageToPictureDisp(image);
button.Mask = AxHostConverter.ImageToPictureDisp(mask);
}
catch (COMException exception)
{
Logger.Debug("Button image could not be set for button [" + button.Caption + "]\n" + exception);
}
}
Я знаю из KB286460 - Как установить свойства маски и изображения для командных панелей Office XP
Свойства Mask и Picture определены как тип IPictureDisp, который является членом библиотеки Stdole. IPictureDisp использует методы, которые нельзя распределить через границы процесса. Поэтому свойства Маска и Изображение можно вызывать только в процессе (макросы VBA, надстройки автоматизации и библиотеки ActiveX выполняются в процессе).
Я знаю, как обрабатывать AccessViolationException, что я мог бы украсить метод с HandleProcessCorruptedStateExceptions
атрибут, но я не думаю, что я хочу продолжать с поврежденным государством. Может быть, это испорченное государство доброкачественно, и я могу продолжать?
Интересно, что окно Autos Visual Studio обрабатывает Picture
Доступ к исключению без проблем:
Кажется, что SolidWorks VBE почему-то не рассматривает / размещает Rubberduck как тот же процесс, что и CommandBarButtons. Это говорит о том, что другие хосты VBE могут делать то же самое.
РЕДАКТИРОВАТЬ Я не уверен, что это уместно, но я использую старую версию SolidWorks 2006 под Windows 10, и для ее запуска я настроил ее запуск с правами администратора.
Я знаю, что доступ к Picture
/ Mask
Свойства будут вызывать AccessViolation, но как я могу определить, является ли свойство доступным для чтения / записи, прежде чем фактически пытаться получить к нему доступ?
Я мог бы проверить, является ли хост-приложение SolidWorks, но я бы предпочел более общий подход, который работает для любого хоста, который имеет такое же поведение.