Un método externo es aquél cuya implementación no se da en el fichero
fuente en que es declarado. Estos métodos se declaran precediendo su
declaración del modificador extern. Como su código se da externamente, en el
fuente se sustituyen las llaves donde debería escribirse su cuerpo por un punto
y coma (;),
quedando una sintaxis de la forma:
extern
<nombreMétodo>(<parámetros>);
La forma en que se asocie el
código externo al método no está definida en la especificación de C# sino que
depende de la implementación que se haga del lenguaje. El único requisito es
que no pueda definirse un método como abstracto y externo a la vez, pero por
todo lo demás puede combinarse con los demás modificadores, incluso pudiéndose
definir métodos virtuales externos.
La forma más habitual de asociar
código externo consiste en preceder la declaración del método de un atributo de tipo System.Runtime.InteropServices.DllImport
que indique en cuál librería de enlace dinámico (DLL) se ha implementado. Este
atributo requiere que el método externo que le siga sea estático, y un ejemplo
de su uso es:
using
System.Runtime.InteropServices; // Aquí
está definido DllImport
public class Externo
{
[DllImport(“kernel32”)]
public static extern
void CopyFile(string fuente, string destino);
public static void
Main()
{
CopyFile(“fuente.dat”,
“destino.dat”);
}
}
El concepto de atributo se
explica detalladamente en el Tema
14:Atributos. Por ahora basta saber que los atributos se usan de forman
similar a los métodos sólo que no están asociados a ningún objeto ni tipo y se
indican entre corchetes ([]) antes de declaraciones de elementos del
lenguaje. En el caso concreto de DllImport lo que indica el parámetro que se le
pasa es cuál es el fichero (por defecto se considera que su extensión es .dll)
donde se encuentra la implementación del método externo a continuación
definido.
Lo que el código del ejemplo
anterior hace es simplemente definir un método de nombre CopyFile() cuyo código se corresponda con el de la
función CopyFile()
del fichero kernel32.dll del API Win32. Este método es llamado en Main() para copiar el fichero de nombre fuente.dat en otro de nombre destino.dat. Nótese que dado que
CopyFile() se ha declarado como static
y se le llama desde la misma clase donde se ha declarado, no es necesario
precederlo de la notación <nombreClase>. para llamarlo.
Como se ve, la utilidad principal
de los métodos externos es permitir hacer llamadas
a código nativo desde código gestionado, lo que puede ser útil por razones
de eficiencia o para reutilizar código antiguamente escrito pero reduce la
portabilidad de la aplicación.