簡體   English   中英

如何以編程方式使自動生成的文件成為Visual Studio中的嵌入式資源?

[英]How to programmatically make an autogenerated file an embedded resource in visual studio?

我有一個復雜的工作流程,如下所示:在Visual Studio(2013)中構建一個項目會導致生成XML文件。 這些文件由另一個項目使用,作為框架的一部分。

但是,對於任何有用的XML文件,都將其標記為嵌入式資源-當前是通過VS UI /表單通過文件的屬性完成的。 這對於手動添加的文件很有用。

但是,如何以編程方式使自動生成的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>

編輯:經過討論...

如以下注釋中所述,如果要通過直接操縱項目文件來執行此操作,則需要執行以下操作:

  1. 將項目作為某種Xml文檔加載。

  2. 找到包含項目文件列表的ItemGroup節點,該節點通常是項目中唯一包含至少一個Compile節點的列表。

  3. 對於每個文件,插入一個新的EmbedResource節點和一個可選的Link節點。 Link節點不是必需的,但這是您手動添加鏈接文件時得到的。

  4. 保存文件。

似乎相當簡單。 我的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”。 我做了一些測試,但似乎沒有任何區別。

希望這可以解決您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM