You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在VSIX扩展中实现勾选指定DLL并添加至WPF项目

解决方案:将选中程序集添加至项目assemblies目录

核心实现逻辑

利用Visual Studio的DTE对象模型操作项目,先确保assemblies目录存在,再根据选中的复选框添加对应程序集引用,并将引用关联到目标目录。


具体步骤与代码实现

1. 引用必要的程序集

在VSIX项目中添加对EnvDTE和EnvDTE80的引用(可通过Visual Studio SDK或NuGet获取)。

2. 获取当前选中项目

在WPF对话框的「Add」按钮点击事件中,定位到当前选中的项目对象:

using EnvDTE;
using EnvDTE80;
using System.Linq;

// 获取Visual Studio DTE实例
var dte = (DTE2)Package.GetGlobalService(typeof(DTE));
var selectedProject = dte.SelectedItems.Item(1).Project;

3. 创建assemblies目录(若不存在)

检查项目中是否已有目标目录,无则创建:

ProjectItem assembliesFolder = null;
foreach (ProjectItem item in selectedProject.ProjectItems)
{
    if (item.Name.Equals("assemblies", System.StringComparison.OrdinalIgnoreCase))
    {
        assembliesFolder = item;
        break;
    }
}

// 文件夹GUID对应标准项目文件夹类型
if (assembliesFolder == null)
{
    assembliesFolder = selectedProject.ProjectItems.AddFolder("assemblies", "{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}");
}

4. 添加选中的程序集引用并关联目录

根据复选框选中状态,逐个添加引用,并针对不同项目类型做目录关联处理:

// 收集选中的程序集名称(假设checkBoxes是对话框中复选框的集合)
var selectedAssemblies = checkBoxes
    .Where(cb => cb.IsChecked == true)
    .Select(cb => cb.Content.ToString())
    .ToList();

foreach (var assemblyName in selectedAssemblies)
{
    // 添加程序集引用
    var reference = selectedProject.References.Add(assemblyName);

    // 区分项目类型处理目录关联
    if (selectedProject.Kind == "{9A19103F-16F7-4668-BE54-9A1E7A4F7556}")
    {
        // .NET Core/.NET 5+ SDK风格项目:修改csproj文件添加<Link>元素
        var csprojPath = selectedProject.FileName;
        var projDoc = System.Xml.Linq.XDocument.Load(csprojPath);
        var ns = projDoc.Root.GetDefaultNamespace();

        // 找到或创建存放assemblies引用的ItemGroup
        var assemblyItemGroup = projDoc.Descendants(ns + "ItemGroup")
            .FirstOrDefault(g => g.Elements(ns + "Reference")
                .Any(r => r.Element(ns + "Link")?.Value.StartsWith("assemblies\\") == true)) 
            ?? new System.Xml.Linq.XElement(ns + "ItemGroup");

        if (!projDoc.Root.Elements().Contains(assemblyItemGroup))
        {
            projDoc.Root.Add(assemblyItemGroup);
        }

        // 给目标引用添加Link节点,关联到assemblies目录
        var referenceElement = projDoc.Descendants(ns + "Reference")
            .FirstOrDefault(r => r.Attribute("Include")?.Value == assemblyName);
        if (referenceElement != null)
        {
            referenceElement.SetElementValue(ns + "Link", $"assemblies\\{assemblyName}.dll");
        }

        projDoc.Save(csprojPath);
        selectedProject.Refresh();
    }
    else
    {
        // .NET Framework项目:修改引用属性并移动到assemblies文件夹
        reference.Properties.Item("SubType").Value = "Component";
        reference.ProjectItem.MoveTo(assembliesFolder);
    }
}

关键注意事项

  • 程序集名称需准确:强命名程序集需使用完整名称(如System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)
  • 异常处理:需添加try-catch块处理文件读写、引用添加失败等异常场景
  • 项目GUID对应:{9A19103F-16F7-4668-BE54-9A1E7A4F7556}是.NET Core/.NET SDK项目的标准Kind值,可按需扩展其他项目类型

内容的提问来源于stack exchange,提问作者jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:40:27