Как указать свое собственное растровое изображение при вызове 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
событие, например, здесь, чтобы отследить или переопределить загрузку ресурсных (или других) сборок.