Pour faire suite à une discussion ou je me suis fait traiter de "vieux papy scribouillard".

Voici un petit tuto qui explique la différence entre une DLL normale et une DLL .NET

1 - Tout d'abord, qu'est-ce qu'une DLL normale (Win32) ?
Un fichier .dll contient du code compilé, que vous pouvez utiliser dans votre application pour exécuter des fonctions de programme spécifiques requises par une autre application ou un autre module (tel que .exe ou .dll) pour le charger via un point d'entrée.
C'est une bibliothèque qui contient du code et des données qui peuvent être utilisés par plusieurs programmes à la fois.
C'est la clé pour écrire du code modulaire, permettant une gestion efficace de la mémoire ainsi que la réduction de l'espace disque.
Ce qui au final, permet à l'OS et aux programmes de se charger plus rapidement.

2 - Qu'est-ce qu'une DLL .Net (Assembly) ?
Lorsque vous implémentez une DLL (Assembly) .Net dans des langages .NET tels que C # ou VB.NET, vous produisez un assemblage managé.
"Managed Assembly" est la norme de composant spécifiée par .NET.
Par conséquent, les assemblys .Net ne sont compréhensibles que par Microsoft.NET et ne peuvent être utilisés que dans les applications gérées .NET.
Un "assembly" est exécuté par .NET Runtime. Lorsque vous créez une DLL avec C ++, vous produisez une DLL win32 / Com. Si vous utilisez cette DLL dans un langage .NET, Visual Studio crée automatiquement un fichier INTEROP pour vous afin que vous puissiez appeler la DLL "non managée" à partir du code de gestion.

Pour utiliser une DLL (Assembly) .Net, l'option la plus simple consiste à copier la DLL dans le dossier bin et l'enregistrer avec l'outil "regsvr32".

Enfin les DLL .NET sont du code IL (Intermediate language) qui nécessite la présence du CLR (framework .NET) pour fonctionner.
A l'inverse les DLL Win32 natives n'ont pas besoin d'être enregistrées car elles sont compilées directement en binaire, elles n'ont donc pas besoin d'un run-time et peuvent se trouver dans le même répertoire que l'exécutable.

On dit de .NET que c'est du code managé, car le CLR (Common Language Runtime) qui exécute le code IL (Intermediate Language) effectue des contrôles pour éviter les débordements de mémoire et pour libérer automatiquemt les ressources allouées.


3 - Qu'est-ce que du code "unsafe" ?
Le code Win32 est dit "unsafe" car toute la gestion mémoire et l'allocation libération des ressources doit être faite par le programmeur, car il est en prise directe avec l'OS
Toute l'API bas niveau de Windows est écrite en code "unsafe" C ou C++, les assemblies .NET l'utilise pour faire tourner les applications managées.
C'est la raison pour laquelle le code bas niveau est toujours plus rapide en exécution car on élimine la surcouche du CLR.
Les DLLs "unsafe" permettent également d'écrire des drivers et d'interagir directement avec l'OS (l'écriture de "hook" par exemple).