获取项目的程序集名称

Get assemblyname of a project

我需要什么

我想获取 Visual Studio 扩展中项目的程序集名称。

因为我知道您可以在解决方案资源管理器中右键单击一个项目时看到它 select Properties。它将在选项卡 Application 中显示 Assemblyname

设置

我的扩展项目中有一个“命令”,它会在您右键单击解决方案资源管理器中的某个内容时显示。只要有人单击命令,就会执行以下代码:

var dte = await GetDTE2Async();

await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

var selectedItem = GetSelectedItem(dte);
var props = selectedItem.ContainingProject.Properties;
//I just assumed that the `AssemblyName` could be somewhere in the `Properties` Property.

GetSelectedItem 方法如下所示:

public static ProjectItem GetSelectedItem(DTE2 dte)
{
    ThreadHelper.ThrowIfNotOnUIThread();
    var items = (Array)dte.ToolWindows.SolutionExplorer.SelectedItems;

    return items.Cast<UIHierarchyItem>().FirstOrDefault().Object as ProjectItem;
}

也许你可以试试:

System.Reflection.Assembly.GetAssembly(Property's Type).FullName

对于遇到同样问题的其他人,我实际上已经非常接近我的目标了。

我是怎么找到它的

这只是猜测,在我的例子中,我假设 Properties 是一堆 Property 项。

之后我就收集了 IEnumerable 拥有的所有密钥对值。然后看到实际上有一个名为 AssemblyName 的项目确实匹配正确的值。

var items = selectedItem.ContainingProject.Properties.Cast<Property>()

var sb = new StringBuilder();

foreach (var item in items)
{
    sb.Append($"Name : {item.Name} ");
    try
    {
        sb.Append("Value : " + item.Value.ToString());
    }
    catch (Exception)
    {
        sb.Append("Value : NOT DEFINED (EXCEPTION)");
    }
    finally
    {
        sb.AppendLine();
    }
}
var output = sb.ToString();

解决方案

这是一个相当短的部分,但我们开始吧:

var assemblyName = selectedItem.ContainingProject.Properties.Cast<Property>().FirstOrDefault(x=> x.Name == "AssemblyName").Value;

基本上,我只是搜索与名称 AssemblyName 匹配的第一个元素并获取其值。