Как указать свое собственное растровое изображение при вызове Commands2.AddNamedCommand2? - PullRequest
1 голос
/ 14 октября 2010

Я пишу надстройку для 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, Версия = 0.1.3939.33205, Культура = en, PublicKeyToken = null 'или один из его зависимостей. Система не может найти указанный файл.

Что я делаю не так?

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

EDIT2: Проект на github , если кто-то захочет посмотреть на источник и / или попытаться воспроизвести проблему.

1 Ответ

3 голосов
/ 12 ноября 2010

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

resgen.exe "Path\To\Resource.resx" "Path\To\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 (или альтернативно задаете версию сборки ресурса в.exe или используйте атрибут [assembly: System.Resources.SatelliteContractVersion()]), вы должны пройти исключение FileNotFoundException.Использование resgen.exe также может сказать вам, почему сборка не генерируется и не связывается автоматически.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...