C# 以编程方式将资源嵌入.NET程序集中

C# 以编程方式将资源嵌入.NET程序集中,c#,.net,embedded-resource,C#,.net,Embedded Resource,我正在尝试生成通用的.NET可执行文件,这些文件可以通过更改嵌入的资源进行自定义。理想情况下,我希望能够通过编译的可执行文件实现这一点,但也可以使用某种中间表示。关键是我需要能够用一个程序,而不是手动完成这项工作 考虑这样一个C#程序: 名称空间MyProgram{ 公共课程{ 公共静态void Main(字符串[]args) { 使用(var stream=Assembly.getExecutionGassembly().GetManifestResourceStream(“MyProgram

我正在尝试生成通用的.NET可执行文件,这些文件可以通过更改嵌入的资源进行自定义。理想情况下,我希望能够通过编译的可执行文件实现这一点,但也可以使用某种中间表示。关键是我需要能够用一个程序,而不是手动完成这项工作

考虑这样一个C#程序:

名称空间MyProgram{
公共课程{
公共静态void Main(字符串[]args)
{
使用(var stream=Assembly.getExecutionGassembly().GetManifestResourceStream(“MyProgram.Resources.foo”))
{
//忽略流==null
多斯塔夫河;
}
}
}
}
当一些资源被嵌入并命名为“foo”时,这将按预期工作。然而,我试图完成的是在没有嵌入资源的情况下构建程序,然后对程序进行“后处理”以嵌入资源。事实上,如果既可以嵌入具有任意名称的新资源,又可以将其添加到资源清单中,这样程序就可以在运行时读取嵌入的资源并对其执行操作,那就更好了


有没有一种方法可以通过编程将新资源嵌入到编译后的.NET可执行文件中?

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

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

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

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

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

的开销。我打赌最简单的方法是动态修改csproj文件并使用编译器。如果我编辑csproj以包含资源,这会自动将它们添加到资源清单中,以便在运行时枚举它们吗?这是一个不错的解决方案,如果是这样的话……这不是不可能的,但是推荐的安装位置和反恶意软件会让你头疼,没有人需要。区分一个文件(其中包含必须在运行时创建的嵌入式资源)和一个普通资源(通常存储在文件中)很快就失去了意义。如果仍要执行此操作,请使用System.CodeDom。是否确实需要嵌入它?我们使用服务器脚本来构建和代码签名自解压归档,其中包括应用程序和动态定制的附加文件。对于PHP,我们使用OSSLSignCode,对于Tomcat,我们使用一些Java代码签名包(我不知道是哪一个)。我希望避免调用编译器来构建定制的可执行文件,但除此之外,这是一个很好的解决方案。非常感谢。
<Project>
  <ItemGroup>
    <EmbeddedResource Include="Content\Item1.png" />
    <EmbeddedResource Include="Content\Item2.png" />
  </ItemGroup>
</Project>
msbuild Resources.sln