Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I replace embedded resources in a .NET assembly programmatically?

I am trying to replace a Resource of an exe (.NET, C#) file using C# code.

I have found this article and made this code (using 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");

The code is actually removing the resource and then adding a new one with the same name. The resource name is encFile and stored as encFile.exe (tried both).

I tested the code and the remove is working (i can tell by the size of the file) and the adding too, but the new file crash just like the file i created with the remove only (for the testing) - it acts like he can't see the replaced resource.

What can i do to fix it? Maybe some changes in the edited EXE file? The EXE file reads its resource this way:

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

like image 848
eranj Avatar asked Aug 03 '11 12:08

eranj


People also ask

How do I embed a resource file in net assemblies?

resources) file by using Resource File Generator (resgen.exe). You can then embed the . resources file in a . NET assembly by using a language compiler or embed it in a satellite assembly by using Assembly Linker (Al.exe).

How do I add embedded resources to Visual Studio?

Open Solution Explorer add files you want to embed. Right click on the files then click on Properties . In Properties window and change Build Action to Embedded Resource . After that you should write the embedded resources to file in order to be able to run it.

What is embedded resource C#?

Embedded files are called as Embedded Resources and these files can be accessed at runtime using the Assembly class of the System.Reflection namespace. This article will illustrate, how to read and display an embedded Text file and Image file in Windows Application (Windows Forms) in C# and VB.Net.


1 Answers

Trying to do this seems overly complex. If you need dynamic update of resources, ship your resources as a folder for your application (set items in the folder as content and copy if newer in project properties).

If you need dynamic update at runtime, then it's as simple as either:

1] Allow user to replace items in place or
2] Even better, treat it like word-press themes and allow an override folder for each resource.

If you need to tag each resource with metadata you could use a sqlite database or even easier, allow a matching .meta file for each resource to describe it in more detail.

Finally, if you are allowing digital download of your software, then you might consider code-signing your executable - in which case modifying the executable in any way will not be an option.

like image 54
jjxtra Avatar answered Oct 31 '22 18:10

jjxtra