У меня есть расширение Visual Studio, которое включает в себя пакет и Tagger в том же VSIX.Расширяемость Visual Studio: как контролировать порядок загрузки компонентов?
Когда пакет загружен, он инициализирует несколько вещей, включая регистратор. Tagger использует регистратор. Все это работает для меня, но на одной клиентской машине Tagger загружается перед пакетом и падает, потому что регистратор еще не инициализирован.
Как выразить Visual Studio, что она должна всегда загружать пакет перед загрузкой Tagger?
Пакет выглядит следующим образом:
[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)]
public sealed class EntrianInlineWatchPackage : Package ...
Таггер выглядит следующим образом:
[Export(typeof(IViewTaggerProvider))]
[ContentType("C/C++")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(ValueTag))]
public class ValueTaggerProvider : IViewTaggerProvider
{
[Import]
internal IClassifierAggregatorService AggregatorService;
public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
{
...
return buffer.Properties.GetOrCreateSingletonProperty("com.entrian.ValueTagger", delegate() {
IClassifier classifier = AggregatorService.GetClassifier(buffer);
return new ValueTagger(classifier, textView, buffer) as ITagger<T>;
}) as ITagger<T>;
vsixmanifest выглядит следующим образом:
<Content>
<VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
Спасибо!
Это выглядит идеально, за исключением одного: как я могу называть 'GetService' перед загрузкой пакета? В моем текущем коде, когда что-то, кроме моего пакета (например, Tagger), нуждается в услуге, он вызывает метод «GetService» пакета, но все дело в том, что Tagger загружается перед пакетом, это сделать ...? – RichieHindle
Вы не должны вызывать код своего пакета из кода Tagger (поэтому не вызывайте метод GetService вашего пакета оттуда).Проверьте 2-ую ссылку («Как получить услугу»): код метки не знает, кто реализует сервис SMyLogger, он запрашивает его, хотя стандартные методы VS (просто случается, что вы реализовали обе стороны, но это не имеет значения, это какой-то механизм интродукции зависимостей +, если вы это сделаете). –
Я понимаю, что не делать. :-) Я не понимаю, что такое «ServiceProvider» в вашем примере? Когда я пытаюсь вызвать 'ServiceProvider.GetService()', я получаю «Требуется ссылка на объект», что кажется разумным - на каком объекте я должен называть «GetService»? (Я нахожу «ServiceProvider» в «Microsoft.VisualStudio.Shell» - это не тот?) – RichieHindle