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

4
我正在尝试生成可通过更改嵌入资源进行自定义的通用 .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”时,这将按预期工作。然而,我试图完成的是在没有嵌入资源的情况下构建程序,然后“后处理”程序以嵌入资源。实际上,如果可以同时嵌入具有任意名称的新资源并将其添加到资源清单中,则更好,以便在运行时程序可以读取嵌入的资源并对其进行操作。

是否有一种编程方式可以将新资源嵌入已编译的.NET可执行文件中?


我打赌最简单的方法是实时修改csproj文件并使用编译器。 - Dan Wilson
如果我编辑 csproj 以包括资源,那么它们会自动添加到资源清单中,以便在运行时枚举吗?如果是这样,那不是一个坏的解决方案... - millinon
2
这并非不可能,但是建议的安装位置和反恶意软件程序会让你头疼,而这是无人需要的。很快就没有意义去区分一个包含必须在运行时创建的嵌入式资源的文件和仅被存储在文件中的普通资源。如果你仍想这样做,可以使用System.CodeDom。 - Hans Passant
真的需要嵌入吗?我们使用服务器脚本构建和代码签名自解压归档文件,其中包括应用程序以及动态定制的附加文件。对于PHP,我们使用OSSLSignCode,对于Tomcat,我们使用一些Java代码签名包(我不知道是哪一个)。 - Dave S
1个回答

3

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

你可以将资源复制到特定的目录(例如Content)中。

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 的开销。


我本来希望避免调用编译器来构建定制的可执行文件,但除此之外这是一个很好的解决方案。谢谢! - millinon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接