c# - studio - Ruta(física)(instalada) de DLL instalada en el GAC
reg dll gac (4)
¿Cómo puedo obtener la ruta de acceso (física) instalada de una DLL que está (puede) estar registrada en GAC? Este archivo DLL es un control que puede alojarse en cosas que no sean una aplicación .Net (incluidos IDEs que no sean VS ...).
Cuando uso System.Reflection.Assembly.GetExecutingAssembly (). Location, proporciona la ruta de la carpeta GAC en winnt / system32 - o en modo Diseño en VS da la ruta al VS IDE.
Necesito obtener la ruta donde físicamente está instalada la DLL, o la carpeta bin / debug o (versión) para VS.
La razón es que hay un archivo XML que necesito encontrar en esta carpeta, con ajustes de configuración que se usan tanto en modo de diseño como en tiempo de ejecución.
¿O cómo es mejor manejar este escenario? Tengo una ubicación de red dudosa que estoy utilizando para el modo de diseño en este momento ... (No creo que la carpeta ApplicationData vaya a cortarla (pero tenga la versión .Net instalada ya que está instalada a través de ClickOnce y puede usar Clickonce Data) carpeta))
¿Tiene la opción de incrustar un recurso en esta DLL? De esta manera, realmente no importa dónde se encuentra el archivo DLL en el disco, porque el archivo XML lo seguirá. Entonces puedes hacer algo como esto:
Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyProject.MyXmlFile.xml");
XmlDocument d = new XmlDocument();
using (StreamReader r = new StreamReader(s))
{
d.LoadXml(r.ReadToEnd());
}
Después de que el ensamblaje se copia en la sombra en el caché de Global Assembly, no creo que haya ningún metadato para rastrear la ubicación de los ensamblados de origen.
¿Qué estás tratando de lograr al implementar en GAC? Si solo es por el bien de CLR para propósitos de resolución, entonces hay una manera alternativa que resuelve su problema.
No instale gac el dll, más bien agregue la siguiente clave en el registro (CLR busca esta ubicación de registro cuando intenta resolver ensamblajes)
32 bit OS : HKEY_LOCAL_MACHINE/SOFTWARE//Microsoft/.NETFramework/v4.0.30319/AssemblyFoldersEx/foo
64 bit OS : HKEY_LOCAL_MACHINE/SOFTWARE/Wow6432Node/Microsoft/.NETFramework/v4.0.30319/AssemblyFoldersEx/foo
Para la tecla foo (use su nombre favorito en lugar de foo), verá un Nombre de clave "Predeterminado". Haga doble clic en él y establezca el valor donde sea que exista su ensamblaje. (se prefiere la ruta absoluta)
Ahora, desde Visual Studio, su cliente debería poder ver sus ensamblajes en el cuadro de diálogo "Agregar referencia" y puede usarlos.
Ahora llegando a tu problema real,
Assembly.GetExecutingAssembly()
devolverá la ruta de la ubicación donde están presentes los dll insatulados. Encuentra el archivo XML desde allí. :)
Nota: en la clave de registro, la 4.0.30319 es la versión de .NET Framework que su aplicación apunta. Use la versión de su aplicación en su lugar.
Si algo se pone en el GAC, en realidad se copia en un punto debajo de% WINDIR% / assembly, como
C:/WINDOWS/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
Supongo que verá algo así cuando compruebe la ubicación del ensamblaje en cuestión cuando está instalado en el GAC. Eso es realmente correcto. (En .NET 1.1 había una "Codebase" en la lista cuando mirabas las propiedades de un ensamblado de GAC, pero eso era solo para mostrarte dónde estaba el archivo original cuando ejecutabas gacutil; en realidad, no indicaba qué se cargaría). ) Puedes leer más sobre eso aquí .
Para resumir, es posible que no puedas hacer lo que quieres hacer. En lugar de buscar en relación con algún ensamblado que se está cargando ( Assembly.GetExecutingAssembly()
), es posible que desee cambiar el comportamiento para que se vea en relación con el ensamblado de la aplicación principal ( Assembly.GetEntryAssembly()
) o poner el archivo en algún conocido ubicación, posiblemente basada en una variable de entorno que se establece.
Si está buscando la ubicación física donde su DLL GACed está guardada en el sistema de archivos, intente esto: start -> run -> c: / windows / assembly / gac Si no encuentra su carpeta relacionada con DLL allí , puede hacer una carpeta "Arriba" en el Explorador de Windows para mostrar todo en c: / windows / assembly como estructuras de carpetas. A continuación, puede buscar su archivo DLL en GAC_MSIL o cualquier otra carpeta por ahí ....
Saludos, Sri