2016-11-02 5 views
1

Я пытаюсь выяснить, как использовать rosyln для вставки атрибутов сборки в AssemblyInfo.cs.Вставить ассемблеры сборки в AssemblyInfo.cs

Мои атрибуты выглядеть примерно так:

[assembly: Foo(@"\\somepath\tosomething)"] 

И я могу читать их так:

var syntaxRoot = tree.GetRoot(); 

var attr = syntaxRoot.DescendantNodes().OfType<AttributeSyntax>(); 
var attrNames = attr.Select(a => a.Name); 
var deployments = attr.Where(a => a.Name.ToString() == "Foo") 
    .Select(d => d.DescendantTokens() 
    .FirstOrDefault(t => t.Kind() == SyntaxKind.StringLiteralToken).ValueText); 

И я могу получить аргумент, который был передан в атрибуте.

Я могу попытаться вставить атрибут как так:

var list = new List<SyntaxNode>() 
{ 
    SyntaxFactory.AttributeList(SyntaxFactory.SeparatedList<AttributeSyntax>(new List<AttributeSyntax>() 
    { 
     SyntaxFactory.Attribute(SyntaxFactory.ParseName("DeploymentLocation")) 
    })) 
}; 
var n = tree.GetRoot().InsertNodesAfter(tree.GetRoot().ChildNodes().Last(), list); 

Это будет вставить узел, который заканчивает тем, что ищет что-то вроде этого:

... 
[assembly: AssemblyFileVersion("1.0.0.0")] 
[DeploymentLocation] 

Так он добавил свой атрибут, но это Безразлично У меня есть префикс assembly:, и я не могу понять, как получить там строковые литералы.

Я знаю, что мог (и, вероятно, должен) просто загрузить файл и использовать простой текстовый редактор для вставки строк, но в интересах понимания того, как Рослин должен работать.

ответ

2

Оклейка код в Roslyn Quoter показывает

.WithTarget(
     AttributeTargetSpecifier(
      Token(SyntaxKind.AssemblyKeyword))))) 
+0

га. Это круто. Я не знал об этом инструменте. –