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

时间:2011-08-03 12:22:48

标签: c# resources add edit mono.cecil

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

我找到this article并制作了此代码(使用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");

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

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

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

2 个答案:

答案 0 :(得分:4)

尝试检查以下代码项目文章可能会有所帮助

http://www.codeproject.com/KB/dotnet/embeddedresources.aspx

答案 1 :(得分:1)

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

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

1]允许用户替换现成的项目或
2]更好的是,将其像按单词的主题一样对待,并为每个资源提供一个替代文件夹。

如果需要用元数据标记每个资源,则可以使用sqlite数据库,甚至更简单,请为每个资源提供一个匹配的.meta文件,以更详细地描述它。

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