Я создал новый проект расширения VSIX в Visual Studio 2012 и написал классификатор MEF (как тест), который должен просто выделить весь текст в файле .mylang
. Вот соответствующие части моего кода .NET 4.5:
internal static class MyLangLanguage
{
public const string ContentType = "mylang";
public const string FileExtension = ".mylang";
[Export(typeof(ClassificationTypeDefinition))]
[Name(ContentType)]
[BaseDefinition("code")]
internal static ContentTypeDefinition MyLangSyntaxContentTypeDefinition = null;
[Export]
[FileExtension(FileExtension)]
[ContentType(ContentType)]
internal static FileExtensionToContentTypeDefinition MyLangSyntaxFileExtensionDefinition = null;
}
[Export(typeof(IClassifierProvider))]
[ContentType(MyLangLanguage.ContentType)]
[Name("MyLangSyntaxProvider")]
internal sealed class MyLangSyntaxProvider : IClassifierProvider
{
[Import]
internal IClassificationTypeRegistryService ClassificationRegistry = null;
public IClassifier GetClassifier(ITextBuffer buffer)
{
return buffer.Properties.GetOrCreateSingletonProperty(() => new MyLangSyntax(ClassificationRegistry, buffer));
}
}
internal sealed class MyLangSyntax : IClassifier { }
Это соответствующие части из моего файла source.extension.vsixmanifest
. Основываясь на предложениях и подобных файлах, которые я нашел через Интернет, я добавил зависимость от MPF и двух активов.
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<!-- ... -->
<Dependencies>
<Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="4.5" />
<Dependency d:Source="Installed" Id="Microsoft.VisualStudio.MPF.11.0" DisplayName="Visual Studio MPF 11.0" Version="[11.0,12.0)" />
</Dependencies>
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%|" />
</Assets>
</PackageManifest>
Я также пробовал манифест версии 1.0:
<?xml version="1.0" encoding="utf-8"?>
<Vsix Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
<!-- ... -->
<References />
<Content>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
</Vsix>
Когда я запускаю его, он запускает экспериментальный экземпляр Visual Studio 2012, а окно "Расширения и обновления" показывает, что мое расширение активно. Однако, когда я загружаю или создаю файл .mylang, он ничего не делает. Любые исключения, которые я бросаю (как тест) из моего расширения, никогда не бросаются. Точки останова никогда не попадают и получают восклицательный знак со следующим предупреждением:
В настоящий момент точка останова не будет удалена. Для этого документа не были загружены никакие символы.
Мне кажется, что мое расширение никогда не загружается вообще. Моя проблема аналогична этой проблеме и этой проблеме, но я использую Visual Studio 2012, которая использует новый формат манифеста VSIX.
Что я знаю:
- Я могу найти свой файл DLL и VSIX в папке
%localappdata%\Microsoft\VisualStudio\11.0Exp\Extensions\MyLang\VSIXProject1\1.0
, поэтому я знаю, что они скопированы. - Их временная метка соответствует тому, когда я последний раз строил проект, поэтому я знаю, что они актуальны.
- Свойства проектa > Отладкa > Запустить внешнюю программу: уже автоматически установлено значение
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
, а аргументы командной строки автоматически установлены на/rootsuffix Exp
. - Журнал Visual Studio (созданный с помощью опции
/log
) имеет две записи, связанные с моим расширением:Successfully loaded extension...
иExtension is enabled...
. - Моя DLL не появляется на вкладке "Модули" (список всех загруженных DLL) отладки Visual Studio, в то время как некоторые (не все) другие расширения появляются.
- Он не загружается в Visual Studio 2012 или 2010 как на моем ноутбуке, так и на моем настольном ПК.
Что я пробовал:
- Установите
<IncludeAssemblyInVSIXContainer>
вtrue
в файле .csproj, за это предложение, но это не имеет никакого значения. - Я не могу добавить строку
<MefComponent>|%CurrentProject%|</MefComponent>
в файл source.extension.vsixmanifest, поскольку он использует другой формат (2.0), чем проекты VSIX для предыдущих версий Visual Studio (1.0). - Это предложение (настройка
IncludeAssemblyInVSIXContainer
и друзей в моем .csproj наtrue
), но это не имеет значения. И мои контрольные точки все еще показывают предупреждение и не попадают. - Reset Экспериментальный экземпляр VS с использованием Reset ярлыка экспериментальной инстанции Visual Studio 2012 в меню "Пуск" в соответствии с этим предложением. Это не имело значения.
Как я могу, по крайней мере, убедиться, что мое расширение VSIX MEF загружено и работает? И если это возможно, как я могу сделать работу контрольной точки и отладить ее?