如何以编程方式替换.net程序集中的嵌入式资源

本文关键字:集中 程序集 嵌入式 资源 程序 net 编程 方式 替换 | 更新日期: 2023-09-27 18:04:17

我正在尝试替换exe (. exe)的资源。. NET, c#)文件使用c#代码。

我找到了这篇文章,并制作了这个代码(使用Mono。塞西尔0.6):

AssemblyDefinition asdDefinition = AssemblyFactory.GetAssembly("C:''File.exe");
EmbeddedResource erTemp = new EmbeddedResource("encFile", ManifestResourceAttributes.Public);
erTemp.Data = myNewFileBytes;
asdDefinition.MainModule.Resources.RemoveAt(0);
asdDefinition.MainModule.Resources.Add(erTemp);
AssemblyFactory.SaveAssembly(asdDefinition, "C:''newFile.exe");

代码实际上是删除资源,然后添加一个具有相同名称的新资源。资源名称为encFile,存储为encFile.exe(两者都尝试过)。

我测试了代码,删除工作(我可以通过文件的大小来判断)和添加,但是新文件崩溃就像我只使用删除创建的文件一样(用于测试)-它的行为就像他看不到被替换的资源。

我能做些什么来修复它?也许在编辑的EXE文件中有一些变化?EXE文件以这种方式读取其资源:

byte[] buffer = ProjectName.Properties.Resources.encFile;

如何以编程方式替换.net程序集中的嵌入式资源

尝试这样做似乎过于复杂。如果需要动态更新资源,将资源作为应用程序的文件夹(将文件夹中的项设置为内容,并将更新的项复制到项目属性中)。

如果你需要在运行时进行动态更新,那么这很简单:

1]允许用户在适当的位置或
2]更好的是,把它当作word-press主题,并允许每个资源的覆盖文件夹。

如果你需要用元数据标记每个资源,你可以使用sqlite数据库,或者更简单,允许每个资源匹配一个。meta文件来更详细地描述它。

最后,如果您允许软件的数字下载,那么您可以考虑对可执行文件进行代码签名——在这种情况下,以任何方式修改可执行文件都是不可能的。