Visual Studio扩展 - 设置“复制到输出目录”属性

时间:2017-03-28 11:10:17

标签: c# visual-studio visual-studio-extensions vsix

我正在创建一个VS扩展,我想在解决方案中添加一个文件并设置一些属性。其中一个是Copy to output directory,但我找不到设置它的方法。设置Build action工作正常,但调试时甚至没有在数组中列出所需的属性。

private EnvDTE.ProjectItem AddFileToSolution(string filePath)
{
  var folder = CurrentProject.ProjectItems.AddFolder(Path.GetDirectoryName(filePath));
  var item = folder.ProjectItems.AddFromFileCopy(filePath);

  item.Properties.Item("BuildAction").Value = "None";
  // item.Properties.Item("CopyToOutputDirectory").Value = "CopyAlways"; // doesn't work - the dictionary doesn't contain this item, so it throws an exception

  return item;
}

如何为新添加的项目设置属性?

2 个答案:

答案 0 :(得分:3)

请修改如下代码,它适合我。

.so

更新

请在代码中添加以下代码,然后检查字典对象是否包含' CopyToOutputDirectory'

    foreach (Property p in item.Properties)
            {
                if (p.Name == "CopyToOutputDirectory")
                {
                    p.Value = 1;
                }

                //dic[p.Name] = p.Value;
            }

答案 1 :(得分:3)

对于C#或VB项目,Cole Wu - MSFT的答案应该有效。

如果你试图为不同类型的项目做同样的事情,那么你可能会因为每个项目类型都有不同的属性而运气不好。

从我的尝试:

  • C#和VB有23个属性,包括“CopyToOutputDirectory”
  • F#有9个属性,包括“CopyToOutputDirectory”
  • Node.js有13个属性,缺少“CopyToOutputDirectory”

查看您要修改的项目中文件的属性窗口。它是否包含“CopyToOutputDirectory”属性?如果不是这个属性可能不可用。

编辑:

设置ProjectItem属性的另一个选项是通过它的属性(在* .csproj中修改它)。我会说这是解决方法,而不是真正的解决方案,因为你之后需要重新加载项目。

private EnvDTE.ProjectItem AddFileToSolution(string filePath)
{
    var folder = CurrentProject.ProjectItems.AddFolder(Path.GetDirectoryName(filePath));
    var item = folder.ProjectItems.AddFromFileCopy(filePath);

    item.Properties.Item("BuildAction").Value = "None";

    // Setting attribute instead of property, becase property is not available
    SetProjectItemPropertyAsAttribute(CurrentProject, item, "CopyToOutputDirectory", "Always");

    // Reload project

    return item;
}

private void SetProjectItemPropertyAsAttribute(Project project, ProjectItem projectItem, string attributeName,
    string attributeValue)
{
    IVsHierarchy hierarchy;
    ((IVsSolution)Package.GetGlobalService(typeof(SVsSolution)))
        .GetProjectOfUniqueName(project.UniqueName, out hierarchy);

    IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage;

    if (buildPropertyStorage != null)
    {
        string fullPath = (string)projectItem.Properties.Item("FullPath").Value;

        uint itemId;
        hierarchy.ParseCanonicalName(fullPath, out itemId);

        buildPropertyStorage.SetItemAttribute(itemId, attributeName, attributeValue);
    }
}