以编程方式在.NET程序集中嵌入资源

时间:2018-04-11 18:17:15

标签: c# .net embedded-resource

我正在尝试生成可以通过更改嵌入资源来自定义的通用.NET可执行文件。理想情况下,我希望能够使用已编译的可执行文件执行此操作,但使用某种中间表示也是可以接受的。关键是我需要能够使用程序执行此操作,而不是手动执行此操作。

考虑一个看起来像这样的C#程序:

namespace MyProgram {
    public class Program {
        public static void Main(string[] args)
        {
            using(var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProgram.Resources.foo"))
            {
                // ignore stream == null
                DoStuff(stream);
            }
        }
    }
}

当某些资源被嵌入并命名为" foo"时,这将按预期工作。但是,我想要完成的是在没有嵌入资源的情况下构建程序,然后进行后期处理'嵌入资源的程序。实际上,如果可以嵌入具有任意名称的新资源并将其添加到资源清单中,那么在运行时程序可以读取嵌入的资源并对其进行操作,这样会更好。 / p>

有没有办法以编程方式将新资源嵌入到已编译的.NET可执行文件中?

1 个答案:

答案 0 :(得分:1)

假设您有一个名为Resources.csproj的项目。

您可以将资源复制到特定目录(例如内容)。

Project directory structure
----------------------------
Properties
  AssemblyInfo.cs
Content
  Item1.png
  Item2.png

然后,您可以使用XDocument或类似内容动态更新csproj文件,以将您的内容包含为嵌入资源。

<Project>
  <ItemGroup>
    <EmbeddedResource Include="Content\Item1.png" />
    <EmbeddedResource Include="Content\Item2.png" />
  </ItemGroup>
</Project>

然后你可以随意编译项目。

msbuild Resources.sln

您的资源应该在输出程序集中可用。优点是这种方法避免了处理CodeDom的开销。