• 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?

17 answers to this question

Recommended Posts

  • 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. :)

  • 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 >.>

  • 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

  • 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?

  • 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.

  • 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

  • 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.

  • 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

  • 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

  • 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
  • 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

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

    • No registered users viewing this page.
  • Posts

    • The problem isn't with Epic, it's with the platform holders like Steam and Nintendo, they should be a lot more strict in their review process.
    • Hello, Installed here without issue. Regards, Aryeh Goretsky
    • Microsoft updates Visual Studio Code with easier language model discovery and in-app search by Paul Hill Microsoft has released Visual Studio Code 1.125, its latest weekly release. This week, the company has focused on discovering and installing extra language models via the Marketplace; searching the web and securely browsing over remote connections without leaving VS Code; choosing how long VS Code waits before installing extension updates; and delivering managed Copilot settings through existing device management tooling. In older versions of VS Code, extensions could contribute their own model providers, but to find these extensions, you needed the right tags to search for in the Extension view. Now, the Language Models editor gives you an Install Model Providers button that opens the Extensions view, which is filtered to extensions that contribute model providers, making it easier to find and install them. Once you install a provider, its model will appear in the model picker. If you use the integrated browser much, you can now look up information without leaving VS Code by typing a query into the integrated browser’s address bar. It will use your configured search engine, the same way a standalone browser does. You can use workbench.browser.searchEngine to pick a search engine. When the browser is opened in a remote workspace, it's now possible to proxy HTTP(S) traffic via the remote connection. This allows you to connect to any ports or services that can only be accessed from the remote machine. If you read our coverage from two weeks ago about VS Code 1.123, you might have seen that extension updates have a two-hour delay as a safety measure. In this update, Microsoft is giving you the ability to configure the time of the delay. You can find it under extensions.autoUpdateDelay. Finally, with this update, admins can deliver managed GitHub Copilot settings through native device management (MDM) channels on Windows and macOS, in addition to account-based enterprise settings files. Settings delivered via MDM appear as policy-enforced in VS Code and can’t be overridden locally. Future updates will extend the supported policy keys across Copilot surfaces. You can download the update from the Visual Studio Code website now.
    • "it opens up new doors for people who prefer using Edge, but cannot be bothered to configure a Microsoft account" You already have a Microsoft account if you are using Windows 11, because you can't set it up without one.
  • Recent Achievements

    • Week One Done
      Classifyskilleducation earned a badge
      Week One Done
    • One Month Later
      eurospharma62 earned a badge
      One Month Later
    • Week One Done
      With What earned a badge
      Week One Done
    • Week One Done
      Harris Gilbert earned a badge
      Week One Done
    • One Month Later
      Vincian earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      543
    2. 2
      +Edouard
      171
    3. 3
      PsYcHoKiLLa
      84
    4. 4
      ATLien_0
      64
    5. 5
      neufuse
      64
  • Tell a friend

    Love Neowin? Tell a friend!