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

era*_*anj 16 c# resources edit add mono.cecil

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

我找到了这篇文章并制作了这段代码(使用Mono.Cecil 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");
Run Code Online (Sandbox Code Playgroud)

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

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

我该怎么做才能解决这个问题?可能在编辑的EXE文件中有一些变化?EXE文件以这种方式读取其资源: byte[] buffer = ProjectName.Properties.Resources.encFile;

jjx*_*tra 1

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

如果您需要在运行时动态更新,那么它很简单:

1] 允许用户就地替换项目或
2] 更好的是,将其视为 word-press 主题并允许每个资源有一个覆盖文件夹。

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

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