向动态生成的 .NET 程序集添加默认图标
Adding a default icon to a dynamically generated .NET assembly
我正在动态生成 .NET 程序集并使用两种不同的方法向其添加资源:
- ModuleBuilder.DefineResource
- AssemblyBuilder.DefineResource
其中一个资源是一个图标(添加到程序集中的唯一图标),我希望此图标在 Windows 资源管理器中显示为可执行文件的默认图标。使用以下代码,资源可以很好地嵌入并且可以访问,但不会在 Windows 资源管理器中显示为可执行文件的默认图标。
using (var writerIcon = moduleBuilder.DefineResource(nameAssembly.Name + ".Resources.IconMain", "Application resources.", ResourceAttributes.Public))
{
using (var icon = new Icon(@"Icon.ico"))
{
writerIcon.AddResource("Main.ico", icon);
}
builderAssembly.Save(@"MyPE.exe", PortableExecutableKinds.ILOnly, ImageFileMachine.I386);
}
或
using (var writer = assemblyBuilder.DefineResource(nameAssembly.Name + ".Resources.IconMain", "Application resources.", nameAssembly.Name + ".Resources.IconMain", ResourceAttributes.Public))
{
using (var icon = new Icon(@"Icon.ico"))
{
writerIcon.AddResource("Main.ico", icon);
}
builderAssembly.Save(@"MyPE.exe", PortableExecutableKinds.ILOnly, ImageFileMachine.I386);
}
我知道 .NET 程序集处理资源的方式与本机 PE 不同,但我不确定这是否相关。底线是,我没有看到通过代码指定它的方法。
在 Visual Studio 中,您可以指定一个程序集图标,我想通过托管代码(如有必要,通过 P/Invoke 实现)。任何指针将不胜感激。
我最终使用了 CodeDom 而不是动态程序集生成。这不是个人偏好,但它通过为编译器指定参数让我可以更好地控制资源和程序集生成选项。
我正在动态生成 .NET 程序集并使用两种不同的方法向其添加资源:
- ModuleBuilder.DefineResource
- AssemblyBuilder.DefineResource
其中一个资源是一个图标(添加到程序集中的唯一图标),我希望此图标在 Windows 资源管理器中显示为可执行文件的默认图标。使用以下代码,资源可以很好地嵌入并且可以访问,但不会在 Windows 资源管理器中显示为可执行文件的默认图标。
using (var writerIcon = moduleBuilder.DefineResource(nameAssembly.Name + ".Resources.IconMain", "Application resources.", ResourceAttributes.Public))
{
using (var icon = new Icon(@"Icon.ico"))
{
writerIcon.AddResource("Main.ico", icon);
}
builderAssembly.Save(@"MyPE.exe", PortableExecutableKinds.ILOnly, ImageFileMachine.I386);
}
或
using (var writer = assemblyBuilder.DefineResource(nameAssembly.Name + ".Resources.IconMain", "Application resources.", nameAssembly.Name + ".Resources.IconMain", ResourceAttributes.Public))
{
using (var icon = new Icon(@"Icon.ico"))
{
writerIcon.AddResource("Main.ico", icon);
}
builderAssembly.Save(@"MyPE.exe", PortableExecutableKinds.ILOnly, ImageFileMachine.I386);
}
我知道 .NET 程序集处理资源的方式与本机 PE 不同,但我不确定这是否相关。底线是,我没有看到通过代码指定它的方法。
在 Visual Studio 中,您可以指定一个程序集图标,我想通过托管代码(如有必要,通过 P/Invoke 实现)。任何指针将不胜感激。
我最终使用了 CodeDom 而不是动态程序集生成。这不是个人偏好,但它通过为编译器指定参数让我可以更好地控制资源和程序集生成选项。