簡體   English   中英

如何防止嵌入資源的資源組件生成

[英]How to prevent resource assembly generation for embedded resources

我有一個項目,其中嵌入了一些文件,其中兩個以.SMS.something 編譯項目時,即使我沒有指定任何我想要使用附屬程序集的文件,也會生成“SMS”文化的附屬程序集,它甚至是文化?

我到處尋找解釋,但我不知所措。 我發現的唯一的事情是人們試圖將他們的資源集合嵌入到他們的可執行文件中,但這不是我的情況。 我只想讓我所有的嵌入式資源(只有一種語言)在同一個程序集中。

如何防止自動生成附屬程序集,或指定SMS不是文化?

我設法通過查看Microsoft.Common.targets和Microsoft.CSharp.targets以及確定哪些任務實際對資源進行了排序並給出了名稱,以一種非常hacky的方式解決了這個問題。

所以我用一個將ManifestResourceName和LogicalName設置為我想要的東西來覆蓋CreateCSharpManifestResourceName任務:

<!-- Overriding this task in order to set ManifestResourceName and LogicalName -->
<UsingTask TaskName="CreateCSharpManifestResourceName" TaskFactory="CodeTaskFactory"
           AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <ResourceFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]"
                   Required="true" />
    <RootNamespace ParameterType="System.String"
                   Required="true" />
    <PrependCultureAsDirectory
                   ParameterType="System.Boolean" />
    <ResourceFilesWithManifestResourceNames
                   ParameterType="Microsoft.Build.Framework.ITaskItem[]"
                   Output="true" />
  </ParameterGroup>
  <Task>
    <Code Type="Fragment" Language="cs">
      foreach (ITaskItem item in ResourceFiles) {
        var link = item.GetMetadata("Link").Replace("\\", "/");
        link = "/" + link.TrimStart('/');
        item.SetMetadata("ManifestResourceName", link);
        item.SetMetadata("LogicalName", link);
      }
      ResourceFilesWithManifestResourceNames = ResourceFiles;
    </Code>
  </Task>
</UsingTask>

作為一個額外的好處,我嵌入的文件獲取他們的實際路徑(僅用\\替換為/ )作為他們的資源名稱,因此可以使用Assembly.GetManifestResourceStream(x)輕松查找,其中x將是例如/path.to/my.SMS.file

然后我用一個只返回沒有任何文件的文件來覆蓋AssignCulture任務,並向他們添加<WithCulture>false</WithCulture> (這完全符合我的情況):

<!-- Overriding this task to set WithCulture and sort them as not having culture -->
<UsingTask TaskName="AssignCulture" TaskFactory="CodeTaskFactory"
           AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
  <ParameterGroup>
    <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]"
           Required="true" />
    <AssignedFilesWithCulture
           ParameterType="Microsoft.Build.Framework.ITaskItem[]"
           Output="true" />
    <AssignedFilesWithNoCulture
           ParameterType="Microsoft.Build.Framework.ITaskItem[]"
           Output="true" />
    </ParameterGroup>
    <Task>
        <Code Type="Fragment" Language="cs">
            ITaskItem[] withCulture = new ITaskItem[Files.Length];
            ITaskItem[] withoutCulture = new ITaskItem[Files.Length];
            for (var i = 0; i &lt; Files.Length; i++) {
                ITaskItem item = Files[i];
                var wc = item.GetMetadata("WithCulture");
                if (wc == "") { item.SetMetadata("WithCulture", "False"); }
                if (wc.ToLowerInvariant() == "true") {
                    withCulture[i] = item;
                } else {
                    withoutCulture[i] = item;
                }
                var type = item.GetMetadata("Type");
                if (type == "") { item.SetMetadata("Type", "Non-Resx"); }
            }
            AssignedFilesWithCulture = withCulture;
            AssignedFilesWithNoCulture = withoutCulture;
        </Code>
    </Task>
</UsingTask>

暫無
暫無

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

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