Как назначить относительный путь встраиваемого образа в ActiveSheet.PageSetup.LeftHeaderPicture.FileName?

Для этого есть 2 SSCCE:

1.

Я добавил изображение в свою надстройку уровня документа VSTO, щелкнув правой кнопкой мыши по решению → добавить → существующий элемент → myPic.jpg.

Теперь я работаю с электронной таблицей Excel и хочу добавить картинку в верхний левый заголовок. Используя PageSetup.LeftHeaderPicture.FileName и предоставляя абсолютный путь к изображению, который он загружает, просто отлично во время отладки.

Когда я пытаюсь изменить путь до не абсолютного и сказать что-то вроде

ActiveSheet.PageSetup.LeftHeaderPicture.FileName = "\\Assets\\myPic.jpg"

Я продолжаю получать исключение HRESULT: 0x800A03EC.

enter image description here

Я думаю, что я не получаю правильный синтаксис для доступа к Assets\myPic.jpg.

2.

Я добавил новый ресурс, выбрал существующий элемент и выбрал myPic.jpg. Я могу получить к нему доступ через Resource1.myPic, но ActiveSheet.PageSetup.LeftHeaderPicture только для чтения...

PageSetup.LeftHeaderPicture.FileName нуждается в параметре типа string, и я не уверен, как получить путь к моему уже встроенному ресурс...

Вопрос:

Как вставить картинку в мое решение в качестве ресурса (или только существующего элемента), чтобы иметь возможность использовать его с PageSetup.LeftHeaderPicture.FileName?

Ответ 1

Правильно, я решил.

Добавил существующий элемент myPic.jpg к решению и установил Build Action в Content и Copy to Output Directory в Copy Always (но я уверен, что вы можете установить его для копирования, если он более новый)

enter image description here

Примечание. При этой настройке ваш файл всегда будет "скопирован" в опубликованный каталог.

enter image description here

Теперь все, что вам нужно в вашем коде,

ws.PageSetup.LeftHeaderPicture.Filename = 
                           AppDomain.CurrentDomain.BaseDirectory + "\\myPic.jpg";
ws.PageSetup.LeftHeader = "&G";

AppDomain.CurrentDomain.BaseDirectory очень хорошо объясняется здесь

и конечный результат, как ожидалось

enter image description here

Ответ 2

По моему опыту добавление файлов в проект будет встраивать их в ваш .exe. Это означает, что вы не можете ссылаться на них, используя путь к файлу. Однако вы можете прочитать их.

Если вы хотите, чтобы ваш файл размещался за пределами файла .exe, вы должны просто добавить его в свой проект, затем щелкните его правой кнопкой мыши и выберите свойства. Задайте для свойства Copy to output directory значение Always copy. Ваш файл будет скопирован в папку сборки в той же структуре папок. Теперь вы можете ссылаться на свой файл с относительным путем.

Если вам действительно нужно получить эту фотографию из файла ресурсов, вы можете сохранить ее как временный файл (используя Path.GetTempFileName), а затем загрузить его через путь к файлу.