• 0

[C#] Icon resource is duplicate in the built executable


Question

Hi,

When my application doesn't have any icon resources, all other resources and code produce a 121kb exe file. Then, I manually add the application icon resource to the "Resources.resx" file under the "Icons" category. After that, I compile the application again and since my icon has 66kb, the exe becomes 187kb. Then I open my application project settings and set the application icon by selecting it from the dropdown. After compiling the application again, the exe is now 253kb (187 + 66).

How is that possible? I'm using the same resource, why does the exe size increases like this?

Anyway to workaround the problem?

Link to comment
Share on other sites

17 answers to this question

Recommended Posts

  • 0

Setting the icon as an application resource actually includes the file as an embedded icon, so in a sense you are adding the file again, not using the embedded resource.

Is it really an issue?

Link to comment
Share on other sites

  • 0

A little bit... If I could avoid using extra 66kb... It's not much but if it was possible without much trouble, maybe I wouldn't mind :p. But if it's not possible, oh well...

Link to comment
Share on other sites

  • 0

^ It's actually a good idea. These days, programmers tend to not care about memory usage; after all, 66kb isn't much memory at all. But neither is 1MB or even 10MB. But wasted memory is wasted memory. The smaller the size, the better. :)

Link to comment
Share on other sites

  • 0

i guess wad u could do is either just by choosing the application icon from the browse button.. which will not end up in the resources or by adding it into the resources but not compiling the resources as a embedded content so it will not get embedded twice.. u can do that by clicking on resources.resx in the solution explorer and changing the build action to none..

either way it doesnt hurt does it >.>

Link to comment
Share on other sites

  • 0
I'm not sure what you mean...

first way: (not adding icon to resources)

under project properties > application (the tab where u select your icon) > browse to the icon in your drive

second way: (add icon to resources but dont embed the resources)

add the icon to the project resources then click on Resources.resx under the solution explorer and change the build action property from Embedded Resource to None

either way so the icon will not get embedded twice =.= zzz

Link to comment
Share on other sites

  • 0

I can't do either of that...

I want my icon to be the icon for the .exe file and for the main application window. For the application window, I have to add it to the resources file (or to the form resources, but it will be the same thing). And since I need to add the icon to the resources file to use it as the form icon, why can't I just select "use the same icon" for the .exe?

Link to comment
Share on other sites

  • 0

Looks that way mate, I can't really provide a real solution. I know how annoying things like this can be, especially if you are a perfectionist like me. And by the sound of most of your posts, you are.

Will keep an eye out for solutions, but at the moment, I cant find any.

Link to comment
Share on other sites

  • 0

Hi guys,

I was just wondering if any of you had figured out a solution to this problem? I am having the same issue in VS2008 c#. I add the icon on the properties page which causes it to be embedded but I cannot then get access to it from the:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("resource_file_name");

It does not appear to exist in the assembly, I use the GetManifestNames function to read all the resources and it is not listed.

To make it work I must also add the icon file in solution explorer and set it as an embedded resource, then I am able to reference it in this fashion. Each form can then reference this resource without it being embedded even more times which is what happens if you just choose the icon file from the form properties menu (rubbish).

Oh and also with my method of loading the resource file by hand at form startup it does not get displayed in the design window, also rubbish.

So I have limited it to a single duplicate for my application but it would be nice to cut this down to one, surely it is possible.

Can the .exe be specified from the code/by hand without using the properties page? Then you could use a single .ico resource.

cheers

ed

Link to comment
Share on other sites

  • 0

I think you'd need to access the resource in a different way. The actual program icon would be stored within a specific .rsrc section of the PE format of the file. An executable .NET assembly is a normal Windows PE file with .NET headers. The main icon resource for the program would be stored according to the PE file format, so would not be accessible through the ManifestResourceStream method.

Link to comment
Share on other sites

  • 0

i have skim read this thread, so excuse me if i have the wrong end of the stick..

but there is a bug(?) in visual studio that does not show the icon you select in your project properties screen on the windows forms during debug mode..

have you tried building installer packages for your applications and installing them to your local system?

the icons *should* appear in your app window at the top left

Link to comment
Share on other sites

  • 0

hey,

I haven't tried that. I'm hoping my application will be a single executable and not need too much installing but it is a good suggestion. Maybe we just have to accept two copies of the icon file, I suppose it's not too bad, it would be nice to see a fix tho.

ed

Link to comment
Share on other sites

  • 0

I came across this thread through Google some time ago when writing an application because I had the same problem as the OP. I just lived with the fact that I would have to have the icon in the executable twice. I had the same problem again, today, and a light bulb went off. This still isn't as clean as it should be, but you can do it like this:

In your application's properties (Project -> Properties), set the icon to the file you want it to use. Leave the icon for the form as the default. In the form's constructor (under InitializeComponent()) or in the form's Load event, add this:

this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath);

This get's the application's icon that you set in the properties (and the one that is seen by Explorer, etc) and sets it as your form's icon at run-time. Hope this helps anyone Googling in the future.

Edit: It's worth noting, however, that this doesn't seem to work when running the application from anything other than the local machine (i.e. from a Windows share).

Edited by todd
Link to comment
Share on other sites

  • 0
Edit: It's worth noting, however, that this doesn't seem to work when running the application from anything other than the local machine (i.e. from a Windows share).

It'd be more efficient to PInvoke the LoadIcon API function, and this will prevent you from being snagged by the file location security checks. This will get you an HICON that you can then use Icon.FromHandle on.

Google PInvoke+LoadIcon

Link to comment
Share on other sites

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.