Using Remove Assemblies
Using Remove Assemblies
Hi,
I'm trying to remove assemblies out of the GAC that were put there by my install script; but using the "Remove Unpinned Assemblies" command after the "Apply Uninstall" doesn't remove those assemblies.
I've tried rebooting my computer before and after the uninstall but the assemblies are still there.
I originally used the Install Assemblies command twice on the same set of files; once to copy to Program Files and again to copy them to the GAC. I've tried changing it to using Install Assemblies only to install to the GAC and Install Files to copy to the Program Files directory. Still no go.
Any ideas what I could be doing wrong? If it matters this setup was originally created in IA5.3 and was just opened up in IA6.6 yesterday.
Thanks,
James
I'm trying to remove assemblies out of the GAC that were put there by my install script; but using the "Remove Unpinned Assemblies" command after the "Apply Uninstall" doesn't remove those assemblies.
I've tried rebooting my computer before and after the uninstall but the assemblies are still there.
I originally used the Install Assemblies command twice on the same set of files; once to copy to Program Files and again to copy them to the GAC. I've tried changing it to using Install Assemblies only to install to the GAC and Install Files to copy to the Program Files directory. Still no go.
Any ideas what I could be doing wrong? If it matters this setup was originally created in IA5.3 and was just opened up in IA6.6 yesterday.
Thanks,
James
I've never had any success with installing assemblies into the GAC (as you found out you need to double copy everything). I've tested removing unpinned assemblies in 6.6 and it doesn't appear to do anything. The other mess that you run into is versioning in the GAC. IA can't cleanup a heirarchy of assemblies after an upgrade or patch for instance.
Hence (!) my workaround is to install the native assemblies into my install directories. Then I shell out and run my own script which cleans up the GAC via NGEN before compiling the new assemblies into the GAC. The second reason for using a script is that I can log all the progress. Doesn't appear to be possible via IA (unless you use the /l=filename flag ... and then everything gets logged).
Hence (!) my workaround is to install the native assemblies into my install directories. Then I shell out and run my own script which cleans up the GAC via NGEN before compiling the new assemblies into the GAC. The second reason for using a script is that I can log all the progress. Doesn't appear to be possible via IA (unless you use the /l=filename flag ... and then everything gets logged).
FireDaemon Technologies Limited
http://www.firedaemon.com
http://www.firedaemon.com
H4nd0 wrote:I've never had any success with installing assemblies into the GAC (as you found out you need to double copy everything). I've tested removing unpinned assemblies in 6.6 and it doesn't appear to do anything. The other mess that you run into is versioning in the GAC. IA can't cleanup a heirarchy of assemblies after an upgrade or patch for instance.
In my case I double copy the assemblies because my company produces a component for developers to use and Visual Studio requires the assemblies to be placed in the file system to add a reference. We also produce an add-in to Visual Studio so in order to avoid making additional copies I GAC the assemblies so Visual Studio can find them.
After some more looking around it looks like the GACd assemblies don't get the right Install Reference applied to them. Enumerating (via the Fusion API) the Install References for my assemblies returns nothing; but doing so for assemblies installed by Microsoft setup apps (Visual Studio and Office assemblies) shows Windows Installer as the Installer Reference.
jtjohnson wrote:After some more looking around it looks like the GACd assemblies don't get the right Install Reference applied to them. Enumerating (via the Fusion API) the Install References for my assemblies returns nothing; but doing so for assemblies installed by Microsoft setup apps (Visual Studio and Office assemblies) shows Windows Installer as the Installer Reference.
Oops, I forgot to mention why I did this. I was exploring the possibility of just calling the UninstallAssembly function in the Fusion API; but found that it removes the assembly even if two setups have GAC'd the file without either being uninstalled. I think this is due to the missing Installer Reference in my last post.
James
I think we're getting closer to what is going on. We have another product that is using IA6.2 and I double checked the behavior there and found that the assemblies were being removed on uninstall.
One major difference between our products is that mine is now compiling for .NET 2.0 while the other is .NET 1.1. We also first noticed this happening after we made the switch from .NET 1.1 to .NET 2.0.
Something I found while writing a utility was that I could not get my assemblies to uninstall unless I gave fusion the entire display name of the assembly plus the processorArchitecture field that is present on all of the .NET 2.0+ assemblies I have.
So I did a little test; I've created a basic setup that installs two assemblies to the GAC, one is written in .NET 2.0, the other in .NET 1.1. When I run the setup both are added to the GAC as expected. On uninstall only the .NET 1.1 assembly is removed.
A colleague found a previous thread where this processorArchitecture flag caused problems in an earlier build of IA when installing assemblies.
I have attached an IA6.6 project that runs my test. The .NET 2.0 assembly is named DataDynamics.MyStrongNamedAssembly while the .NET 1.1 assembly is just called TestAssembly.
File Attached:
My dotNET Setup.zip
One major difference between our products is that mine is now compiling for .NET 2.0 while the other is .NET 1.1. We also first noticed this happening after we made the switch from .NET 1.1 to .NET 2.0.
Something I found while writing a utility was that I could not get my assemblies to uninstall unless I gave fusion the entire display name of the assembly plus the processorArchitecture field that is present on all of the .NET 2.0+ assemblies I have.
So I did a little test; I've created a basic setup that installs two assemblies to the GAC, one is written in .NET 2.0, the other in .NET 1.1. When I run the setup both are added to the GAC as expected. On uninstall only the .NET 1.1 assembly is removed.
A colleague found a previous thread where this processorArchitecture flag caused problems in an earlier build of IA when installing assemblies.
I have attached an IA6.6 project that runs my test. The .NET 2.0 assembly is named DataDynamics.MyStrongNamedAssembly while the .NET 1.1 assembly is just called TestAssembly.
File Attached:
My dotNET Setup.zip
-
- Posts: 3452
- Joined: Thu Dec 22, 2005 7:17 pm
- Contact:
Thanks for the reproducible test case! I've escalated to R&D.
Michael Nesmith
InstallAware
Home of The Next Generation MSI Installer
Get your free copy today - http://www.installaware.com/
InstallAware
Home of The Next Generation MSI Installer
Get your free copy today - http://www.installaware.com/
Hello,
I did an investigation on this. It turned out that assemblies DO remove ALWAYS for Net 1.1 but it fails for some 2.0 assemblies. The reason it fails is that sometimes, Windows Installer, corrupts the Global registry cache, and thus there is always a reference to an even unreferenced assembly. The solution is to DELETE the (Default) registry key from the follow to paths ->
HKEY_CURRENT_USER\\Software\\Microsoft\\Installer\\Assemblies\\Global
HKEY_LOCAL_MACHINE\\Software\\Classes\\Installer\\Assemblies\\Global
before trying anything.
Imo though, is better to delete the registry above, and call the gacutil /uf assemblyname for 1.1 or ngen uninstall /f assemblyname for .net 2.0 assemblies by Run Program, so you get your assemblies removed for sure. It's not an IA bug either , it's a strange behavior from Windows Installer, which is going to be fixed on Windows Installer 4.5 (introduced on VISTA SP1, and Windows 2008 Server etc..).
I did an investigation on this. It turned out that assemblies DO remove ALWAYS for Net 1.1 but it fails for some 2.0 assemblies. The reason it fails is that sometimes, Windows Installer, corrupts the Global registry cache, and thus there is always a reference to an even unreferenced assembly. The solution is to DELETE the (Default) registry key from the follow to paths ->
HKEY_CURRENT_USER\\Software\\Microsoft\\Installer\\Assemblies\\Global
HKEY_LOCAL_MACHINE\\Software\\Classes\\Installer\\Assemblies\\Global
before trying anything.
Imo though, is better to delete the registry above, and call the gacutil /uf assemblyname for 1.1 or ngen uninstall /f assemblyname for .net 2.0 assemblies by Run Program, so you get your assemblies removed for sure. It's not an IA bug either , it's a strange behavior from Windows Installer, which is going to be fixed on Windows Installer 4.5 (introduced on VISTA SP1, and Windows 2008 Server etc..).
Panagiotis Kefalidis
Software Design Team Lead
\"In order to succeed, your desire for success should be greater than your fear of failure\"
InstallAware Software Corporation
Software Design Team Lead
\"In order to succeed, your desire for success should be greater than your fear of failure\"
InstallAware Software Corporation
Hi Panagioti,
Before installation both registry sections you mentioned are free of our assemblies. After installing our products their assemblies appear in HKEY_CURRENT_USER. After uninstalling our products their assemblies remain in HKEY_CURRENT_USER. They will be removed from HKEY_CURRENT_USER only if I manually remove them from the GAC. I have not been successful in convincing IA to do the work for me. I can reproduce this with every installation so it's not that it sometimes happens, it always happens. But, as I said, I might be doing something wrong myself. If you want to investigate this further then try this http://www.noemax.com/free_downloads/wcfx_trial.html.
Alexander
Before installation both registry sections you mentioned are free of our assemblies. After installing our products their assemblies appear in HKEY_CURRENT_USER. After uninstalling our products their assemblies remain in HKEY_CURRENT_USER. They will be removed from HKEY_CURRENT_USER only if I manually remove them from the GAC. I have not been successful in convincing IA to do the work for me. I can reproduce this with every installation so it's not that it sometimes happens, it always happens. But, as I said, I might be doing something wrong myself. If you want to investigate this further then try this http://www.noemax.com/free_downloads/wcfx_trial.html.
Alexander
Alma88,
I told you about deleting the (Default) string of it, not entries inside the Registry Hive. On the top of the strings contained in the Hive there is a (Default) key. That's the one needed in both situations.
It's a bug from Windows Installer on .Net 2.0 assemblies and it's confirm by MS also.
I told you about deleting the (Default) string of it, not entries inside the Registry Hive. On the top of the strings contained in the Hive there is a (Default) key. That's the one needed in both situations.
It's a bug from Windows Installer on .Net 2.0 assemblies and it's confirm by MS also.
Panagiotis Kefalidis
Software Design Team Lead
\"In order to succeed, your desire for success should be greater than your fear of failure\"
InstallAware Software Corporation
Software Design Team Lead
\"In order to succeed, your desire for success should be greater than your fear of failure\"
InstallAware Software Corporation
GAC Uninstallation Workaround for Frameworks 1.1, 2.0, 3.5
We ended up having to use GACUTIL.EXE with the /ul switch to uninstall a support file named GAC.TXT which contained the assembly name and version of each assembly to remove.
You can get the direct path to GACUTIL.EXE on a target machine with this script:
... then, a GAC.TXT support file added to the project. In this example three assemblies are listed:
... finally, a Run Program action is added to perform the removal, after the uninstallation is applied:
... we've tested this with 2003, 2005 and 2008 and it's working. Some code was excluded which detects installed versions of Visual Studio, but this should help you all get GAC uninstalls working; best of luck!
You can get the direct path to GACUTIL.EXE on a target machine with this script:
Code: Select all
Comment: Get the path to the framework SDK for 1.1 and 2.0
Check Registry Key HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\sdkInstallRootv1.1 into Framework11Folder
Check Registry Key HKLM\\SOFTWARE\\Microsoft\\.NETFramework\\sdkInstallRootv2.0 into Framework20Folder
Comment: Get the path to the GACUTIL executable
Set Variable GacUtility11 to $Framework11Folder$bin\\GACUTIL.EXE
Set Variable GacUtility20 to $Framework20Folder$bin\\GACUTIL.EXE
... then, a GAC.TXT support file added to the project. In this example three assemblies are listed:
Code: Select all
GeoFramework,Version=2.0.3600.0
GeoFramework.Gps,Version=2.3.3600.20
GeoFramework.Gis,Version=2.0.3600.1
... finally, a Run Program action is added to perform the removal, after the uninstallation is applied:
Code: Select all
Apply Uninstall (get result into variable SUCCESS)
if Variable SUCCESS not Equals CANCEL
if Variable SUCCESS not Equals ERROR
Run Program $GacUtility20$ /ul "$SUPPORTDIR$\\GAC.txt" (WAIT)
end
end
... we've tested this with 2003, 2005 and 2008 and it's working. Some code was excluded which detects installed versions of Visual Studio, but this should help you all get GAC uninstalls working; best of luck!
-
- Posts: 55
- Joined: Wed Mar 11, 2009 5:26 pm
- Contact:
Re: GAC Uninstallation Workaround for Frameworks 1.1, 2.0, 3.5
jperson wrote:We ended up having to use GACUTIL.EXE with the /ul switch to uninstall a support file named GAC.TXT which contained the assembly name and version of each assembly to remove.
But GACUTIL.EXE is ONLY on machines that have the .NET SDK rather than the .NET runtime. Wouldn't this only work on "development" machines rather than end-user machines?
I am running into this problem right now. Since I cant shell out to GACUTIL.EXE, what is the appropriate way to remove the previous file that was installed to the GAC?
-
- Posts: 3452
- Joined: Thu Dec 22, 2005 7:17 pm
- Contact:
InstallAware 8 does this natively for you.
Michael Nesmith
InstallAware
Home of The Next Generation MSI Installer
Get your free copy today - http://www.installaware.com/
InstallAware
Home of The Next Generation MSI Installer
Get your free copy today - http://www.installaware.com/
-
- Posts: 2
- Joined: Wed Mar 04, 2009 2:43 pm
Re: Using Remove Assemblies
I'm now using IA 11 and I can't get it to remove assemblies from the GAC. The install part works just fine.
I've added "Remove Unpinned Assemblies" directly after "Apply Uninstall" but still no joy.
The application help file doesn't say much, what am I missing?
I've added "Remove Unpinned Assemblies" directly after "Apply Uninstall" but still no joy.
The application help file doesn't say much, what am I missing?
Who is online
Users browsing this forum: No registered users and 42 guests