在我的VSPackage的我需要它的实际价值,以取代参考属性的代码。 例如
public static void Main(string[] args) {
Console.WriteLine(Resource.HelloWorld);
}
我要的是与它的实际价值,以取代“Resource.HelloWorld” - 也就是,找到类资源,并得到其静态属性的HelloWorld的价值。 是否Visual Studio中公开任何API来处理项目的代码模型? 它肯定有一个,因为这是非常相似的重命名变量的共同任务。 我不想在输出组件使用反射,因为它是缓慢的,它锁定了一会儿文件。
有没有简单的方式做到这一点,我知道的。 可靠地得到一个AST出的Visual Studio(和改变它)的一直是一个大问题。 的罗莎琳项目的目标之一是创造这样的一个统一的方式,因为许多工具窗口有自己做这样的东西的方式。
有四种方法可以做到这一点:
- 符号
- FileCodeModel +的CodeDOM
- 罗莎琳AST
- 未开发的方法
符号
我相信大多数工具窗口,如代码查看之类的东西代码元素的搜索使用来自编译构建创建的符号。 这不是理想的,因为它是一个小更重物,很难保持同步。 你不得不缓存符号,使这个不慢。 使用反射,你可以看到的CodeView如何实现这一点。
这种方法使用私有程序集。 用于获取符号看起来像这样的代码:
var compilerHost = new IDECompilerHost();
var typeEnumerator = (from compiler in compilerHost.Compilers.Cast<IDECompiler>()
from type in compiler.GetCompilation().MainAssembly.Types
select new Tuple<IDECompiler, CSharpType>(compiler, type));
foreach (var typeTuple in typeEnumerator)
{
Trace.WriteLine(typeTuple.Item2.Name);
var csType = typeTuple.Item2;
foreach (var loc in csType.SourceLocations)
{
var file = loc.FileName.Value;
var line = loc.Position.Line;
var charPos = loc.Position.Character;
}
}
FileCodeModel +的CodeDOM
你可以尝试使用EnvDTE服务来获得一个代码文档相关的FileCodeModel。 这将让你的类和方法。 但它不支持获取方法体。 你跟马车COM搞乱。 这丑陋的,因为COM对象引用CodeFunction或CodeClass可以得到伤病而不让你知道,这意味着你必须保持自己的镜子。
罗莎琳AST
这允许提供相同的功能,既FileCodeModel和符号。 我一直在玩这个,它实际上不是太糟糕了。
未开发的方法
你可以尝试获得与该代码文档关联的基础LanguageServiceProvider。 但是,这是真的不易拉断,并给你留下许多问题。