Staticky a dynamicky linkovane knihovny
Statické linkování v C#
V C# je koncept statického linkování trochu odlišný od tradičních kompilovaných jazyků jako C nebo C++. V C# se většina referencí řeší při kompilaci a výsledný assembly obsahuje metadata o všech závislostech.
- Příklad použití statické třídy:
public static class MatematickeOperace
{
public static int Scitani(int a, int b)
{
return a + b;
}
}
class Program
{
static void Main(string[] args)
{
int vysledek = MatematickeOperace.Scitani(5, 3);
Console.WriteLine($"Výsledek: {vysledek}");
}
}
V tomto případě je MatematickeOperace statická třída, která je "staticky linkována" do hlavního programu. Její kód bude součástí výsledného assembly.
- Vložení resource do assembly:
// Při kompilaci přidáme resource soubor
// csc /resource:MujResource.resx Program.cs
class Program
{
static void Main(string[] args)
{
var rm = new System.Resources.ResourceManager("MujProjekt.MujResource", typeof(Program).Assembly);
string text = rm.GetString("MujText");
Console.WriteLine(text);
}
}
Zde je resource soubor staticky linkován do assembly při kompilaci.
Dynamické linkování v C#
V C# se dynamické linkování často realizuje pomocí reflexe nebo dynamického načítání assembly.
- Dynamické načtení assembly a volání metody:
using System.Reflection;
class Program
{
static void Main(string[] args)
{
// Dynamické načtení assembly
Assembly assembly = Assembly.LoadFrom("MojeKnihovna.dll");
// Získání typu z assembly
Type typ = assembly.GetType("MojeKnihovna.MojeTrida");
// Vytvoření instance
object instance = Activator.CreateInstance(typ);
// Volání metody
MethodInfo metoda = typ.GetMethod("MojeMetoda");
metoda.Invoke(instance, null);
}
}
Tento příklad dynamicky načte assembly MojeKnihovna.dll a zavolá metodu MojeMetoda z třídy MojeTrida.
- Použití rozhraní pro pluginy:
// Definice rozhraní v hlavním programu
public interface IPlugin
{
void Spustit();
}
class Program
{
static void Main(string[] args)
{
string[] pluginSoubory = Directory.GetFiles("plugins", "*.dll");
foreach (string soubor in pluginSoubory)
{
Assembly assembly = Assembly.LoadFrom(soubor);
foreach (Type typ in assembly.GetTypes())
{
if (typeof(IPlugin).IsAssignableFrom(typ))
{
IPlugin plugin = (IPlugin)Activator.CreateInstance(typ);
plugin.Spustit();
}
}
}
}
}
// V samostatném projektu (plugin):
public class MujPlugin : IPlugin
{
public void Spustit()
{
Console.WriteLine("Plugin byl spuštěn!");
}
}
Tento příklad demonstruje systém pluginů, kde hlavní program dynamicky načítá DLL soubory a hledá v nich třídy implementující rozhraní IPlugin.
Tyto příklady ukazují, jak C# pracuje s koncepty podobnými statickému a dynamickému linkování. Statické linkování v C# je většinou reprezentováno přímými referencemi na třídy a metody, zatímco dynamické linkování často využívá reflexi a dynamické načítání assembly.