2011-05-31 6 views
15

En Visual Studio, ¿cuándo debe agregar una referencia a un dll? Siempre trato de tener un mínimo de referencias en mis proyectos, intento incluir solo los que realmente son necesarios.¿Cuál es la diferencia entre usar instrucción y agregar una referencia?

Creo que solo necesito una referencia si tengo una declaración using en mi fuente. Pero eso no siempre es suficiente.

Por ejemplo, tengo un programa muy simple que es using sistema y Microsoft.Practices.EnterpriseLibrary.Data:

using System; 
using Microsoft.Practices.EnterpriseLibrary.Data; 

public class SimpleConnection { 
    private static void Main() { 
     var database = DatabaseFactory.CreateDatabase(); 
     var command = 
      database.GetSqlStringCommand(
       "select table_name from information_schema.tables"); 
     using (var reader = database.ExecuteReader(command)) { 
      while (reader.Read()) { 
       Console.WriteLine(reader.GetString(0)); 
      } 
     } 
    } 
} 

me habría pensar que sólo tengo que hacer referencia del sistema y Microsoft.Practices.EnterpriseLibrary .Datos. Pero eso no es verdad Si no hago referencia a System.Data, el código no se compilará.

El tipo 'System.Data.Common.DbCommand' se definido en un conjunto que no se hace referencia. Debe agregar una referencia al ensamblado 'System.Data, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089'.

¿Cómo puedo saber de antemano cuando tengo que agregar una referencia a algo que no soy using?

+1

Tenga en cuenta que el compilador de C# solo incluye aquellas referencias de ensamblaje en el ensamblado compilado que se utilizan realmente; puede agregar tantas referencias de ensamblado a su proyecto de Visual Studio como desee sin problemas. – dtb

Respuesta

5

hay que añadir una referencia a un conjunto de la clase reside en, y cualesquiera dependencias, que incluye

  • tipos de retorno de otro conjunto (es decir. Un método devuelve un DbCommand) clase base
  • o interfaz de otro conjunto (es decir. una clase deriva de DbCommand o implementa una interfaz)
+0

Marqué su respuesta como la respuesta correcta porque también nombra algunos ejemplos. – comecme

12

Las referencias le dicen al compilador dónde buscar los tipos para importar. declaraciones Uso indican al compilador dónde buscar "nombres completos"

Así que usted puede escribir

using System.Text 

StringBuilder sb; 
// ... 

o

System.Text.StringBuider sb; 
// ... 

Pero de cualquier manera, usted debe tener una referencia al sistema. dll (¿o es mscorlib para StringBuilder?). Sin la referencia, el compilador no sabe qué tipos están disponibles.

+0

esto no es de lo que se trata la pregunta. – Femaref

+0

No lo creo. Él pregunta por qué tener 'using system.text' no es suficiente para que el compilador encuentre los tipos. –

+1

No, se trata de la necesidad de hacer referencia a los ensambles además del que realmente está usando. – Femaref

0

Algunas veces las referencias que agrega tienen una dependencia en otra biblioteca, por lo tanto, debe tener esa biblioteca en sus referencias.

2

El using indica que espacio de nombres está directamente haciendo referencia. A menudo será necesario que incluya otras referencias que que referencia de conjunto.

La única forma es hacer lo que hace y corregir los errores a medida que ocurren o consultar la documentación para ver si eso indica de qué depende el ensamblaje.

No me preocuparía las referencias no utilizadas. Si no se utilizan, entonces no están incluidos.

+0

* ¿Debería preocuparme * por declaraciones 'using' innecesarias? ¿Causarán la inclusión de los dll referenciados incluso si no son necesarios después de todo? – comecme

+1

@comecme - no. Simplemente deberían ser ignorados por el compilador y el enlazador. Alternativamente, haga clic derecho sobre las instrucciones de uso y seleccione la opción "eliminar instrucciones no utilizadas". – ChrisF

1

Agregar una referencia permite utilizar cualquier objeto o funcionalidad contenida en esa DLL.

Una vez que agrega una referencia, puede usar esa funcionalidad.

La cláusula de uso ayuda a acortar el código: puede ahorrar al escribir.

Por ejemplo:

usando System.IO;

puedo luego escribir

Directorio d = [código va aquí]

si tuviera la referencia y no tenía el uso, a continuación, me gustaría escribir

System.IO.Directory d = [El código va aquí]

Pero necesita la referencia para definir la instrucción de uso o para usar esa funcionalidad de la DLL.

Ahora, si agrega una referencia a su código y esa referencia necesita otra DLL, al compilar obtendrá un error sobre la referencia que falta. En el momento del diseño también marcó. Algunos archivos DLL son independientes (no requieren otras referencias), mientras que otros requieren varias referencias, dependiendo de las características o la funcionalidad que esté utilizando.

+0

Entiendo que tengo que hacer referencia al archivo DLL que uso. La pregunta es por qué a veces tengo que agregar referencias a dll que no sabía que estaba usando. – comecme

2

Creo que la respuesta en ese caso es que el código está utilizando un objeto del espacio de nombres System.data. En su ejemplo, el comando var es un DBCommand. Es una referencia de System.Data y no es System o Microsoft.Practices.EnterpriseLibary.Data. Entonces parece que ese código también necesita una referencia de comando. ¿Qué devuelve GetSqlStringCommand? Un System.Data.DBCommand. Mira este enlace. [link] http://msdn.microsoft.com/en-us/library/microsoft.practices.enterpriselibrary.data.database.getsqlstringcommand (v = pandp.31) .aspx Es por eso que necesita la referencia a System.Data .

Cuestiones relacionadas