如何检查/检测在我的VSPackage下运行的Visual Studio版本?
我无法从注册表中获取,因为计算机可能安装了多个版本,所以我猜有一个能够获得它的API.
有人知道如何使用C#从托管的Visual Studio包中获取它吗?
我正在开发一个VS扩展,我希望实现我的UI将使用颜色(字体,背景等),具体取决于所选的VS颜色方案.做这个的最好方式是什么.我可以绑定WPF中的一些静态资源吗?
我正在开发Visual Studio扩展,其中一个函数创建一个新的应用程序域并将程序集加载到该应用程序域中.然后它在app域中运行一些函数.我想做什么,并且不确定是否可能,是否有我的扩展程序将调试器附加到新应用程序域中运行的代码,因此当该代码失败时,我实际上可以看到发生了什么.现在我正在盲目地调试动力加载的组件是一种痛苦.
所以我有一个创建我的app域的类,如下所示:
domain = AppDomain.CreateDomain("Test_AppDomain",
AppDomain.CurrentDomain.Evidence,
AppDomain.CurrentDomain.SetupInformation);
Run Code Online (Sandbox Code Playgroud)
然后创建一个这样的对象:
myCollection = domain.CreateInstanceAndUnwrap(
typeof(MyCollection).Assembly.FullName,
typeof(MyCollection).FullName,
false,
BindingFlags.Default,
null,
new object[] { assemblyPath }, null, null);
Run Code Online (Sandbox Code Playgroud)
MyCollection
在它的构造函数中执行类似的操作:
_assembly = Assembly.LoadFrom(assemblyPath);
Run Code Online (Sandbox Code Playgroud)
所以现在已经加载了程序集,Test_AppDomain
因为该MyCollection
对象是在该域中创建的.这是我需要能够附加调试器的加载程序集.
在某些时候myCollection
创建一个对象的实例并挂钩一些事件:
currentObject = Activator.CreateInstance(objectType) as IObjectBase;
proxy.RunRequested += (o, e) => { currentObject?.Run(); };
Run Code Online (Sandbox Code Playgroud)
基本上我有处理程序RunRequested
和运行的地方currentObject?.Run()
,我想要附加一个调试器,虽然它可能不是一个问题(并且可能实际上工作得更好)如果先前附加了调试器.
有没有办法实现这一目标?当用户触发将导致在Run
调用的新AppDomain中创建的对象的功能的事件时,是否可以以编程方式附加调试器?如何附加调试器(而不是扩展本身)?
我试过这样的事情:
var processes = dte.Debugger.LocalProcesses.Cast<EnvDTE.Process>();
var currentProcess = System.Diagnostics.Process.GetCurrentProcess().Id;
var process = processes.FirstOrDefault(p => p.ProcessID == currentProcess);
process?.Attach();
Run Code Online (Sandbox Code Playgroud)
但似乎内部的id System.Diagnostics.Process.GetCurrentProcess().Id
不存在LocalProcesses …
Visual Studio使用私有注册表配置单元而不是"污染"系统注册表 - 通常在这样的地方找到:
C:\Users\Abx\AppData\Local\Microsoft\VisualStudio\15.0_4b0ba1c0\privateregistry.bin
[为了确定已安装的扩展,我们需要查看以下密钥:
Software\Microsoft\VisualStudio\15.0_4b0ba1c0\ExtensionManager\EnabledExtensions
]
在C#中通过键加载和访问此文件的最简单方法是什么?
我在代码视图中使用右键菜单编写了visual studio(2010)扩展.我希望能够从我的菜单项事件处理程序中检查当前代码,但是无法在对象模型中找到某个位置来执行此操作.
如何在visual studio扩展中访问当前窗口中的代码?
下面是我用来获取当前文档文本的代码
DTE dte = Package.GetGlobalService(typeof(DTE)) as DTE ;
TextDocument activeDoc = dte.ActiveDocument.Object() as TextDocument;
var text = activeDoc.CreateEditPoint(activeDoc.StartPoint).GetText(activeDoc.EndPoint);
Run Code Online (Sandbox Code Playgroud) c# visual-studio-2010 vspackage vsix visual-studio-extensions
我正在维护一个公司内部Visual Studio扩展,它被打包并部署为VSIX容器.此扩展目前针对VS 2010.它使用几个VS API DLL并引用它们的VS 2010版本.
我目前正在迁移此扩展程序以与VS 2012/2013兼容.我已经发现可以手动编辑旧的VSIX清单以允许扩展另外安装到VS 2012/2013 - 这非常有效.
但是我目前使用的一些VS 2010 API与VS 2012 ++不兼容,我需要更新它们 - 具有放弃向后兼容性的效果.
我的问题是:我应该如何构建我的解决方案和VSIX以便它与VS 2010,2012和2013兼容.是否可以使用一个针对VS 2010的DLL和一个针对VS 2012/2013的DLL并选择一个使用的在延长加载时间?
旁注:我正在使用MEF来构建我的内部功能单元.这会让它变得更容易吗?
有没有办法在Visual Studio 2012下开发VSIX扩展,然后可以在Visual Studio 2010中安装?我已经尝试为Microsoft.VisualStudio.Pro
目标设置版本范围[10.0,11.0]
,但是当我启动已编译的VSIX时,它只提供VS2012安装.
我知道可以在VS2010下开发VSIX,这适用于VS2012,但需要手动编辑.vsixmanifest
文件.但我想知道是否有可能使用更新的VS2012进行开发?
visual-studio-2010 vsix visual-studio-extensions visual-studio-2012
我必须启用MSBuild项目构建输出详细程度的诊断模式才能看到:
1>Done executing task "EnableExtension" -- FAILED. (TaskId:81)
1>Done building target "DeployVsixExtensionFiles" in project "myextension.csproj" -- FAILED.: (TargetId:93)
...
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.27
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法调试我正在处理的Visual Studio扩展包,因为构建输出表明某些内容已失败.什么是有线的,包含所有内容(包括vsix包)的obj和bin文件夹已经创建.我真的不知道我改变了什么特别的,因为几个小时前一切都很好.
我怎样才能调查出了什么问题?
顺便说一句:我正在使用VS 2012 Premium Update 1
编辑:
我记得我做过的事.在处于调试模式时,我输入了Tools - > Extensions and Updates,并卸载了我当前调试的扩展(在该操作之后没有重新启动VS).进一步的调试尝试(在关闭VS的实验实例后的F5)导致这种神秘的构建行为.
我在Visual Studio 2012中创建了一个新的VSIX扩展项目,并编写了一个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 { }
Run Code Online (Sandbox Code Playgroud)
我有一个csproj
覆盖的新式项目文件IntermediateOutputPath
.它看起来像这样:
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
<IntermediateOutputPath>new\path\to\obj</IntermediateOutputPath>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
问题是,我的Visual Studio扩展无法访问IntermediateOutputPath
属性.Project.Properties
与旧的项目格式相比,似乎有更少的东西.
我也尝试project.ConfigurationManager.ActiveConfiguration.Properties
过类似的成功.
有没有办法从Visual Studio扩展中获取此信息?