A rule of thumb would be: you can benefit from putting some assembly to GAC, if you 1) have an assembly which can be referenced by more than one product, 2) multiple products using the same assembly are optional; some may be installed or not.
Also, assemblies installed in GAC are referenced by its
strong names. Referencing them in projects using them should
never involve using any path names of their executable modules (PE files). This is how GAC assemblies are different from local. The are added by the Gacutil.exe:
http://msdn.microsoft.com/en-us/library/aa309379%28v=vs.71%29.aspx[
^].
See also:
http://en.wikipedia.org/wiki/Global_Assembly_Cache[
^],
http://msdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.110%29.aspx[
^],
http://msdn.microsoft.com/en-us/library/6axd4fx6%28v=vs.110%29.aspx[
^].
You should also consider downside of them. They may contaminate the target system. Imagine you have two applications, "productA" and "productB", both using the assembly "myLibrary". You can install them independently in any order, and the first of product installation should also install the assembly "myLibrary". Now, you uninstall "productA" (not necessarily in the same order as installation). As "productB" is still used, "myLibrary" should remain in GAC. Now, you need to install "productB". You should remove "myLibrary', to prevent GAC contamination with unused assemblies. But how to detect if there are no more products still using "myLibrary"? You have to care about all that in your installations.
I, for example, sometimes use an alternative local approach, using application configuration. I put my products using some assembly "myLibrary" in separate sub-directories, and "myLibrary" in some sub-directory shared with all such products using relative path prescribed in application config files (say, some application "myProduct.exe" will need a configuration file named "myProject.exe.config"). Such configuration file can look like this:
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath=".\mySharedLibraries\myLibrary"/>
</assemblyBinding>
</runtime>
</configuration>
—SA