2009-03-10 13 views
10

Tengo la aplicación C# que usa un dll. Cuando intento ejecutar la aplicación, no puede encontrar el dll, a menos que esté en el mismo directorio o en GAC. No quiero tenerlo en el mismo directorio y no quiero instalarlo en GAC. ¿Hay alguna manera de decirle a la aplicación dónde buscar la biblioteca? (Por ejemplo, si quiero distribuir la aplicación a los clientes y que quieren usar sus propias aplicaciones que utilizan la DLL.)¿Cómo establecer la ruta de la biblioteca C# para una aplicación?

Agregado:

me gustaría tener esta estructura de archivos:

MainFolder: Bibliotecas, Aplicaciones

Bibliotecas: lib.dll

Aplicaciones: APP1.EXE

I don' Quiero copiarlo a GAC ​​o tener lib.dll en la carpeta Aplicaciones. ¿Es posible?

+0

Tamara, también es posible editar su pregunta anterior. Esa sería la forma preferida. –

+0

Tamara, esta pregunta es muy parecida a esta http://stackoverflow.com/questions/629459/c-cannot-find-library-during-runtime –

Respuesta

6
+0

¿Esto es básicamente lo mismo que copiar a GAC? –

+0

No, son conceptualmente diferentes. Incluso puede reencaminar un ensamblaje instalado en GAC a otra versión con este método. Debe editar la configuración del equipo o colocar el archivo DLL en un subdirectorio. Dudo que alguno de ellos sea lo que quieres, pero como GvS y Jon señalaron, esto no es bueno en general –

0

Como dije en mi respuesta a su pregunta anterior:

Uso Assembly Redirection instrucciones en su app.config o machine.config.

8

Recomendaría que las aplicaciones de sus clientes copien los dll que usan en su propio directorio.

VB6 utilizado para compartir DLL de entre aplicaciones, tenemos un término para esto: DLL Hell

+0

+1 ¡Gran respuesta! ¡Tengo que votar! –

+0

Utilice el término más moderno para "DLL Hell" ---> The Global Assembly Cache. =) Creo que MS tenía buenas intenciones ("El camino al infierno es ...") cuando crearon el GAC, pero se siente como el mismo viejo ... molestia en la aplicación, funciones faltantes, pasos de implementación adicionales, etc. – StingyJack

1

La DLL tendrá que ser en el GAC o en el directorio de la aplicación o en un subdirectorio, ya que las respuestas a su pregunta anterior dijo.

Si sus clientes desean escribir sus propias aplicaciones utilizando la DLL, debe instalarlo en el GAC o hacer que copien la DLL también. Tener copias múltiples de la biblioteca no hace que suene como algo bueno, pero realmente lo es: significa que puede actualizar una copia a una versión diferente sin romper todo lo demás.

0

Puede iniciar sesión y, a continuación, ver las acciones que tomó el marco tratando de cargar un ensamblaje. Esto hace que diagnosticar errores de carga de ensamblaje sea muy fácil.

La herramienta para hacer ambas cosas es "FUSLOGVW.exe" (Fusion Log Viewer, Fusion es el nombre del cargador) e incluido en el SDK.

4

En su principal:

AppDomain.CurrentDomain.AssemblyResolve += (s,e)=>{ 
    var filename = new AssemblyName(e.Name).Name; 
    var path = string.format(@"C:\path\to\assembly\{0}.dll", filename); 
    return Assembly.LoadFrom(path); 
}; 

Agregue un poco de manipulación a excepción de que

+0

Gracias ; en mi caso, todos nuestros usuarios instalan SDK de productos específicos y sabemos aproximadamente dónde está la biblioteca. El controlador de eventos AssemblyResolve era exactamente lo que necesitaba. – Epu

1

Es posible sin el GAC, pero debe ser ensamblados con nombre seguro y hay que hacer cambios a App.config siempre que la versión o cambios publickeytoken. Esto es lo que tengo Programa principal en \, Libs compartidas en \ Compartido. y un subprograma que quiero separar en \ SDK, usa .. \ Shared para los ensamblados.

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="shared" /> 
     <dependentAssembly> 
     <assemblyIdentity name="protobuf-net" publicKeyToken="257b51d87d2e4d67" /> 
     <codeBase version="1.0.0.282" href="../protobuf-net.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SevenUpdate.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.4.0" href="../SevenUpdate.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="SharpBits.Base" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../SharpBits.Base.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Windows" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../System.Windows.dll"/> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WPFLocalizeExtension" publicKeyToken="5d1aea1de74f122c" /> 
     <codeBase version="11.5.5.0" href="../WPFLocalizeExtension.dll"/> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
Cuestiones relacionadas