针对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";
SetProjectItemPropertyAsAttribute(CurrentProject, item, "CopyToOutputDirectory", "Always");
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);
}
}