以编程方式将资源嵌入 .NET 程序集中
Programmatically Embed Resource in .NET Assembly
我正在尝试生成可以通过更改嵌入式资源来自定义的通用 .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" 时,这将按预期工作。但是,我想要完成的是在没有嵌入资源的情况下构建程序,然后 'post-processing' 嵌入资源的程序。事实上,如果可以嵌入一个具有任意名称的新资源并将其添加到资源清单中,那么在运行时程序可以读取嵌入的资源并对其进行操作会更好。
有没有办法以编程方式将新资源嵌入到已编译的 .NET 可执行文件中?
假设您有一个名为 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
.
的开销
我正在尝试生成可以通过更改嵌入式资源来自定义的通用 .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" 时,这将按预期工作。但是,我想要完成的是在没有嵌入资源的情况下构建程序,然后 'post-processing' 嵌入资源的程序。事实上,如果可以嵌入一个具有任意名称的新资源并将其添加到资源清单中,那么在运行时程序可以读取嵌入的资源并对其进行操作会更好。
有没有办法以编程方式将新资源嵌入到已编译的 .NET 可执行文件中?
假设您有一个名为 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
.