Não são raras as vezes que temos que fazer uso de um recurso contido em uma biblioteca escrita em código nativo, essa necessidade surge com freqüência quando usamos periféricos tais como, ECF ou até mesmo quando usamos recursos da API do Windows.
Felizmente o .NET Framework nos fornece um recurso de interoperabilidade que permite a execução de métodos contido em bibliotecas escrita em código nativo.
Entendendo um pouco mais.
Podemos usar um recurso contido em uma biblioteca nativa, declarando a sua assinatura em nosso código C# usando extern e static e decorando o método como o atributo [DllImportAttribute].
O CLR se encarrega de carregar a DLL em questão na memória e realizar as devidas conversões entre os tipo do .NET e os do código nativo, isso tudo ocorre de maneira transparente por debaixo dos panos.
O trecho de código abaixo nos mostra como fazer isso:
[DllImport("user32.dll", EntryPoint="MessageBox")]
public static extern int MsgBox(int hWnd, String text, String caption, uint type);
A user32.dll faz parte da API do Windows, e é responsável por fornecer funções para manipulação de janelas, mensagens e comunicação. Como podemos notar a declaração do método não tem uma implementação, isso acontece porque na verdade o que estamos fazendo e criar um contrato uma especificação da função, para que possamos usar a função existente dentro da user32.dll em nosso código C#. No exemplo usamos o EntryPoint porque a assinatura do método esta com o nome diferente do nome original da DLL, mas se nós usarmos exatamente o mesmo nome não precisamos declarar esse parâmetro no atributo deixando a declaração igual apresentada abaixo.
[DllImport("user32.dll"")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
O EntryPoint se torna interessante quando estamos trabalhando com métodos nada declarativo, com nomes que dificulta entendimento da sua real intenção (isso é muito comum quando estamos trabalhando com código escritos em linguagem nativa).
Bora coda um pouquinho.
Abra o visual Studio e crie uma projeto do tipo ConsoleApplication

Coloque o seguinte código
using System;
using System.Runtime.InteropServices;
namespace Interoperabilidade
{
class Program
{
[DllImport("user32.dll")]
public static extern int MessageBox(int hWnd, String text, String caption, uint type);
static void Main(string[] args)
{
MessageBox(0, "Trabalhando com código nativo com C#", "Interoperabilidade", 0);
}
}
}
Rode e você terá o seguinte resultado.

Como podemos ver a função MessageBox da user32.dll foi executada sem problemas. Esse é um excelente recurso do .Net Framework, graças a isso podemos utilizar bibliotecas escritas linguagem nativa em nosso código C# (ou em qualquer outra linguagem suportada pelo .Net).
Conclusão.
Interoperabilidade é um assunto muito extenso e interessante (que não se resume a classe DllImportAttribute), e esse texto não tem o intenção de esgotar esse assunto em alguma linha, você pode e deve estudar e tratar esse tema com carinho e dedicação, por se tratar de um recurso "inevitável" em qualquer tipo de aplicativo, acredite se você não teve a necessidade de trabalhar com esse recurso, você ainda terá, espero te dado um norte para que você possa iniciar o seus estudos sobre interoperabilidade.
Você pode encontrar mais informações a respeito da classe DllImportAttribute