[英]How to mark a file as an embedded resource in Visual Studio Code?
[英]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>
編輯:經過討論...
如以下注釋中所述,如果要通過直接操縱項目文件來執行此操作,則需要執行以下操作:
將項目作為某種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”。 我做了一些測試,但似乎沒有任何區別。
希望這可以解決您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.