Visual Studio 扩展 - 设置 "Copy To Output Directory" 属性
Visual Studio Extension - set "Copy To Output Directory" property
我正在创建一个 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;
}
如何为新添加的项目设置 属性?
请像下面这样修改代码,它适用于我这边。
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;
}
对于 C# 或 VB 项目,Cole Wu - MSFT 的答案应该有效。
如果您尝试对不同类型的项目做同样的事情,那么您可能就不走运了,因为每个项目类型都有不同的属性。
根据我的尝试:
- C# 和 VB 有 23 个属性,包括 "CopyToOutputDirectory"
- F# 有 9 个属性,包括 "CopyToOutputDirectory"
- Node.js 有 13 个属性,缺少 "CopyToOutputDirectory"
查看您要修改的项目中的文件 属性 window。它包含 "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);
}
}
我正在创建一个 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;
}
如何为新添加的项目设置 属性?
请像下面这样修改代码,它适用于我这边。
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;
}
对于 C# 或 VB 项目,Cole Wu - MSFT 的答案应该有效。
如果您尝试对不同类型的项目做同样的事情,那么您可能就不走运了,因为每个项目类型都有不同的属性。
根据我的尝试:
- C# 和 VB 有 23 个属性,包括 "CopyToOutputDirectory"
- F# 有 9 个属性,包括 "CopyToOutputDirectory"
- Node.js 有 13 个属性,缺少 "CopyToOutputDirectory"
查看您要修改的项目中的文件 属性 window。它包含 "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);
}
}