2008-11-07 14 views

Respuesta

20

Si desea obtener el archivo de configuración del dominio de aplicación actual, entonces todo lo que necesita hacer es:

ConfigurationManager.AppSettings ....

(esto requiere una referencia a System.Configuration por supuesto).

Para responder a su pregunta, puede hacerlo como Ray dijo (o use Assembly.GetExecutingAssembly().FullName) pero creo que el problema se resuelve más fácilmente usando ConfigurationManager.

+0

¿Funcionará esta solución con la aplicación asp.net? La biblioteca de clases referenciada puede ser utilizada por WinForms y las aplicaciones ASP.NET –

+1

sí, esa es la belleza de ConfigurationManager. Selecciona cualquier aplicación.config/web.config que sea apropiada para el dominio de la aplicación. Esto se introdujo en .NET 2.0. –

+0

Acabo de ejecutar una prueba con una aplicación asp.net y una aplicación WinFomrs y funcionó para ambos entornos. Actualmente estoy ejecutando una prueba con un servicio WCF. Esta es la web que estaba teniendo problemas. –

47

para obtener la respuesta a la pregunta del título:

// Full-name, e.g. MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
string exeAssembly = Assembly.GetEntryAssembly().FullName; 

// or just the "assembly name" part (e.g. "MyApplication") 
string exeAssemblyName = Assembly.GetEntryAssembly().GetName().Name; 

Según lo mencionado por @Ben, ya que usted menciona querer obtener la información de configuración, utilice la clase ConfigurationManager.

+1

que requiere el uso de System.Reflection? –

+1

Sí, eso está en el espacio de nombres System.Reflection. –

+0

Esto fue devuelto por esa llamada: MyApplication, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null –

3

Nunca debe acoplar sus bibliotecas a un consumidor (en este caso, aplicaciones Web, WinForm o WCF). Si su biblioteca necesita configuración, entonces DÁGALA a la biblioteca.

No codifique la biblioteca para extraer esos datos del archivo de configuración del consumidor. Proporcione constructores sobrecargados para esto (para eso están).

Si alguna vez miró el objeto ConfigurationManager.AppSettings, es simplemente un NameValueCollection. Así que cree un constructor en su biblioteca para aceptar un NameValueCollection y pida a su consumidor DAR los datos a la biblioteca.

//Library 
public class MyComponent 
{ 
    //Constructor 
    public MyComponent(NameValueCollection settings) 
    { 
    //do something with your settings now, like assign to a local collection 
    } 
} 

//Consumer 
class Program 
{ 
    static void Main(string[] args) 
    { 
    MyComponent component = new MyComponent(ConfigurationManager.AppSettings); 
    } 
} 
7

Para obtener el nombre exacto y sin versiones, etc. Uso:

string appName = Assembly.GetEntryAssembly().GetName().Name; 

Funciona con .NET v1.1 y posteriores.

+0

Si A.exe usa B.dll, y B.dll usa C.dll, ¿qué ocurre si ese código está en C.dll? – Kiquenet

+1

Aún devuelve A.exe, a menos que A.exe no se administre, o cualquiera de los archivos DLL se carga en un Dominio de aplicación diferente. Para obtener detalles, consulte: http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly(v=vs.110).aspx –

+0

Tengo Service.Host.dll y SvcImpl.dll (< % @ ServiceHost Service = "SvcImpl"%>) Service Host en IIS. Este código en SvcImpl.dll: 1) Assembly.GetEntryAssembly() obtiene nulo. 2) Assembly.GetExecutingAssembly() obtiene SvcImpl. 3) Assembly.GetCallingAssembly(); obtiene System.ServiceModel. ¿Cómo puedo obtener Service.Host programáticamente en SvcImpl si Assembly.GetEntryAssembly() obtiene nulo? – Kiquenet

2

Si desea leer (y pantalla) Número de versión:

Assembly ass = System.Reflection.Assembly.GetExecutingAssembly(); 
    AssemblyName assname = ass.GetName(); 

    Version ver=assname.Version; 

En algún lugar de aplicación (es decir bloque de título en una forma de Windows)

this.Text = "Your title Version " + ver; 
5

Usted puede obtener el conjunto a través de la clase escriba ...

typeof(MyClass).Assembly 
0

Si desea el nombre del principal EXE y no del conjunto de DLL al que se hace referencia - usted wil Necesito usar esto:

Assembly.GetEntryAssembly().GetName().Name 

Esto devolverá el nombre EXE (menos la parte .EXE).

El uso de GetExecutingAssembly() no es correcto según la pregunta del OP (primer párrafo) ya que devolverá el nombre de la DLL.

0

Para el nombre corto de un montaje de una instancia de clase:

Me.GetType().Assembly.GetName().Name 
Cuestiones relacionadas