C# 如何以编程方式使自动生成的文件成为VisualStudio中的嵌入式资源?

C# 如何以编程方式使自动生成的文件成为VisualStudio中的嵌入式资源?,c#,xml,visual-studio,embedded-resource,C#,Xml,Visual Studio,Embedded Resource,我有这样一个复杂的工作流程:VisualStudio(2013)中一个项目的构建导致XML文件的生成。这些文件作为框架的一部分被另一个项目使用 但是,对于任何用途的XML文件,它们都将被标记为嵌入式资源—当前通过VSUI/表单通过文件的属性完成。这适用于手动添加的文件 但是,如何以编程方式将自动生成的XML文件作为嵌入式资源,以便下一个项目可以直接获取它(从某种意义上说),并将文件嵌入到相应的DLL中呢 我目前的猜测是以编程方式编辑.csproj文件,并添加与下面类似的行: <Embedd

我有这样一个复杂的工作流程:VisualStudio(2013)中一个项目的构建导致XML文件的生成。这些文件作为框架的一部分被另一个项目使用

但是,对于任何用途的XML文件,它们都将被标记为嵌入式资源—当前通过VSUI/表单通过文件的属性完成。这适用于手动添加的文件

但是,如何以编程方式将自动生成的XML文件作为嵌入式资源,以便下一个项目可以直接获取它(从某种意义上说),并将文件嵌入到相应的DLL中呢

我目前的猜测是以编程方式编辑
.csproj
文件,并添加与下面类似的行:

<EmbeddedResource Include="Path\To\File\MyEmbeddedResource.meta.xml" />


是吗?

您可以使用链接项和一组适当的构建依赖项(如果它们都是同一解决方案的一部分)来实现这一点

首先,构建项目,以便创建要添加为资源的XML文件

接下来,在要将XML嵌入的项目中,右键单击解决方案资源管理器中的项目,选择“添加现有”并浏览XML文件。在点击浏览器中的“添加”按钮之前,单击其右侧的下拉按钮并选择“添加为链接”。这将确保文件始终是当前文件

选择添加的文件链接并将生成类型更改为“嵌入式资源”

假设您的XML来自同一解决方案中的项目(如果不是,则忽略此位),那么在“项目依赖项”下的“解决方案属性”中,您可以将目标项目(资源将去的地方)设置为依赖于生成XML文件的源项目

或者,如果愿意,您可以自己添加链接:

<EmbeddedResource Include="Path\To\File\MyEmbeddedResource.meta.xml">
    <Link>MyEmbeddedResource.meta.xml</Link>
</EmbeddedResource>
根据需要收集文件列表,并将列表传递给上述方法。如果要禁止创建
节点,请在第三个参数中为其指定“false”。我做了一些测试,但这两种方式似乎都没有任何区别


希望这能解决你的问题。

我想你误解了。我的意思是以编程方式完成“所有”步骤。无需右键单击和添加项目:)然后使用
手动尝试对300多个文件执行此操作:)如果文件位于单个位置(或在几个位置分组),则可以在
添加现有项目
文件选择器中一次选择所有文件。这通过文件的一致性程度缩短了处理过程。否则。。。当我必须构建这样的大列表时,我喜欢在我的fav文本编辑器中使用正则表达式find/replace。我想他们被添加“自动”,而不是有任何手动干预。您不能假设“如果文件位于同一位置”之类的事情,也不能假设其他事情会将问题简化为手动解决方案。不起作用。
// 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);
}