Как указать свое собственное растровое изображение при вызове Commands2.AddNamedCommand2?

Я пишу надстройку Visual Studio и имею растровый ресурс 16x16, который я хотел бы использовать в качестве изображения кнопки для моего пункта меню.

Следуя этим инструкциям из MSDN, я переименовал ресурс 1 и файл 1.bmp затем отредактировал Resources.resx соответственно:

<data name="1" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>..\1.bmp;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>

Затем я изменил свой звонок на Commands2.AddNamedCommand2, проходя false а также 1 в качестве аргументов для MSOButton а также Bitmap соответственно:

Command command = commands.AddNamedCommand2(addIn, "MyAddIn", "MyAddIn", "Open MyAddIn", false, 1, ref contextGUIDS,
                                            (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

Теперь, когда я запускаю надстройку в Visual Studio, Commands2.AddNamedCommand2 бросает FileNotFoundException:

Дополнительная информация: Не удалось загрузить файл или сборку 'MyAddIn.resources, Version=0.1.3939.33205, Culture=en, PublicKeyToken=null' или одну из ее зависимостей. Система не может найти указанный файл.

Что я делаю неправильно?

РЕДАКТИРОВАТЬ: я делаю это в Visual Studio 2005, на случай, если это важно.

РЕДАКТИРОВАТЬ 2: Проект находится на GitHub, если кто-то хочет посмотреть на источник и / или попытаться воспроизвести проблему.

1 ответ

Решение

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

resgen.exe "Путь \ К \Resource.resx" "Путь \ К \Bin\en\MyAddin.resources"
al.exe /c:en /embed:"Path\To\Bin\en\MyAddin.resources" /out:"Path\To\Bin\en\MyAddin.resources.dll"

а затем установите версию сборки на 0.0.0.0 (или альтернативно задайте версию сборки ресурса в команде al.exe, или используйте команду [assembly: System.Resources.SatelliteContractVersion()] атрибут), вы должны пройти исключение FileNotFoundException. Использование resgen.exe также может сказать вам, почему сборка не генерируется и не связывается автоматически.

Вы также можете подписаться на AppDomain.AssemblyResolve событие, например, здесь, чтобы отследить или переопределить загрузку ресурсных (или других) сборок.

Другие вопросы по тегам