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

5

我正在创建一个VS扩展,我想添加一个文件到解决方案并设置一些属性。其中之一是复制到输出目录,但我找不到设置它的方法。设置生成操作可以正常工作,但在调试时所需的属性甚至没有列在数组中。

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;
}

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

你所说的“不工作”是什么意思?你看到了什么错误? - Good Night Nerd Pride
我需要一个像这样的VS扩展。你能分享你的扩展给我吗?我想要粘贴内容并将“复制到输出目录”的默认值设置为“如果较新则复制”,并将构建操作设置为“内容”。谢谢。 - saeid mohammad hashem
2个回答

4

针对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);
    }
}

它有5个项目:BuildActionFileNameFullPathExtensionExtenderCATID,但没有CopyToOutputDirectory。如果它不可用,也许我调用的方式不对? - Lemur
你能否在Visual Studio的属性窗口中手动设置“复制到输出目录”属性,以修改项目中添加的项? - Jan Peldřimovský
可以的,这就是为什么代码中没有这样的选项很奇怪。 - Lemur

3
请将代码修改为以下格式,这样在我的端上可以运行。
    foreach (Property p in item.Properties)
            {
                if (p.Name == "CopyToOutputDirectory")
                {
                    p.Value = 1;
                }

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

更新:
请在您的代码中添加以下代码,然后检查字典对象是否具有“CopyToOutputDirectory”。
 Dictionary<string,object> dic = new Dictionary<string, object>();
            foreach (Property p in item.Properties)
            {
                dic[p.Name] = p.Value;
            }

它对我抛出了“NullReferenceException”,因为该键对应的项不在列表中。 - Lemur
我已经更新了我的回答,请添加相关内容并检查是否有相关属性。 - Zhanglong Wu - MSFT
它有5个项目:BuildActionFileNameFullPathExtensionExtenderCATID,但没有CopyToOutputDirectory - Lemur
如果文件没有名为CopyToOutputDirectory的属性,那么你就无法更改它的值。这将会抛出NullReferenceException异常。 - Zhanglong Wu - MSFT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接