En primer lugar, existe una diferencia importante entre los ensamblajes de referencia y los ensamblajes en el GAC. Para compilar el código, necesita un ensamblaje de referencia. Para ejecutar código, necesita una copia del ensamblado en la misma carpeta que su .exe o el ensamblado en el GAC.
Normalmente, cuando instala una aplicación .NET, su instalador copiará los ensamblajes que utiliza en el GAC. Esos ensamblajes son no utilizables como ensamblados de referencia, no puede encontrar en qué carpeta está almacenada por lo que no puede decirle al compilador el valor correcto de su argumento de línea de comando/referencia. Bueno, puedes averiguarlo, pero Microsoft intentó hacerlo lo más difícil posible con un complemento de shell.
Algo diferente ocurre cuando instala una aplicación .NET que le permite usar sus ensamblajes en su propio programa. Al igual que el .NET framework. Hará dos copias de cada ensamblaje. Uno va al GAC, el otro va a un lugar "conocido". Para .NET Framework, estas ubicaciones conocidas son c: \ windows \ microsoft.net \ y c: \ program files \ reference assemblies. La última carpeta comenzó a ser utilizada por .NET 3.0 y posteriores.
El cuadro de diálogo Agregar referencia de Visual Studio utiliza una clave de registro que enumera estas ubicaciones conocidas. Hay un par, pero el más importante es HKLM\Software\Microsoft\.NETFramework\AssemblyFolders
.
Resumen breve: podría usar esa clave de registro para producir la misma lista que produce el cuadro de diálogo Agregar referencia. Pero no es 100% confiable, es posible que falte a los ensambles de referencia que algún producto copiado en otro lugar. Tendría que usar la pestaña Examinar en VS para agregar referencias a esos. Y busca todo el disco para encontrarlos tú mismo.
Acabo de probar el último punto en su respuesta y no funcionó. 'System.dll' por ejemplo no está incluido en ninguna de las rutas que se encuentran en' HKLM \ Software \ Microsoft \ .NETFramework \ AssemblyFolders' – GETah