您可以使用链接项来实现这一点,并且 - 如果它们都是同一解决方案的一部分 - 一组适当的构建依赖项。
首先,构建项目,以便创建要添加为资源的 XML 文件。
接下来,在要嵌入 XML 的项目中,右键单击解决方案资源管理器中的项目,选择“添加现有”并浏览 XML 文件。在浏览器中点击“添加”按钮之前,单击其右侧的下拉按钮并选择“添加为链接”。这将确保文件始终是当前文件。
选择添加的文件链接并将构建类型更改为“嵌入式资源”。
假设您的 XML 来自同一解决方案中的项目(如果不是,请忽略此位),然后在项目依赖项下的解决方案属性中,您可以将目标项目(资源所在的位置)设置为依赖于源项目构建 XML 文件。
或者,如果您愿意,可以自己添加链接:
<EmbeddedResource Include="Path\To\File\MyEmbeddedResource.meta.xml">
<Link>MyEmbeddedResource.meta.xml</Link>
</EmbeddedResource>
编辑:经过讨论...
如下面的 cmets 所述,如果您想通过直接操作项目文件来做到这一点,您需要执行以下操作:
将项目加载为某种 Xml 文档。
找到包含项目文件列表的ItemGroup节点,这通常是项目中唯一包含至少一个Compile节点的节点。
对于每个文件,插入一个新的 EmbedResource 节点和一个可选的 Link 节点。 Link 节点不是必需的,但这是您手动添加链接文件时得到的。
保存文件。
看起来相当简单。我的 Xml 有点生疏,但这段代码产生了我想要的确切输出:
// required 'using' directives: System.IO, System.Xml.Linq
public static void EmbedResourceFiles(string projectFilename, IEnumerable<string> fileList, bool makeLinks = true)
{
// This is the namespace used by the .csproj Xml file
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
// 1: Open the document
XDocument project = XDocument.Load(projectFilename);
// 2: Locate target ItemGroup
var itemGroup = project.Descendants(ns + "Compile").FirstOrDefault()?.Parent;
if (itemGroup == null)
throw new Exception("Failed to locate correct ItemGroup node in project file");
// 3: Insert EmbedResource nodes
foreach (var file in fileList)
{
var node = new XElement(ns + "EmbeddedResource", new XAttribute("Include", file));
if (makeLinks)
node.Add(new XElement(ns + "Link", Path.GetFileName(file)));
itemGroup.Add(node);
}
// 4: Save it, keeping a backup just in case.
File.Copy(projectFilename, projectFilename + ".bak", true);
project.Save(projectFilename);
}
根据需要收集文件列表并将列表传递给上述方法。如果您想禁止创建<Link> 节点,请在第三个参数中将其设为“false”。我做了一些测试,这两种方法似乎都没有任何区别。
希望这能解决您的问题。