New-EulNativeType #
ÜBERSICHT #
Baut einen Typ mit P/Invoke-Methoden zur Laufzeit - ohne Compiler, ohne Datei im Temp-Verzeichnis.
SYNTAX #
New-EulNativeType [-TypeName] <string> [-Method] <hashtable[]> [<CommonParameters>]
BESCHREIBUNG #
Der Ersatz für Add-Type -TypeDefinition überall dort, wo die C#-Quelle ohnehin nur aus [DllImport]-Deklarationen besteht.
Der Unterschied ist für Kunden spürbar. Add-Type ruft unter Windows PowerShell 5.1 den CodeDom-Anbieter, und der startet csc.exe (und dessen Helfer cvtres.exe), schreibt eine .cs und eine unsignierte .dll ins Temp-Verzeichnis und lädt sie sofort. Aus der Sicht eines Virenscanners ist das wörtlich das Muster eines Droppers: ein Skript startet einen Compiler, legt eine ausführbare Datei ab und lädt sie. Gemessen am 21.09.2026 auf STUDIO: unter 5.1 starten csc und cvtres, unter PowerShell 7 startet kein Compiler-Prozess (dort übersetzt Roslyn im eigenen Prozess).
Reflection.Emit erzeugt die Methoden dagegen direkt im Arbeitsspeicher. Es entsteht keine Datei, kein Prozess startet, und der Weg ist auf beiden Fassungen derselbe.
PARAMETER #
-TypeName #
Type: string
Vollständiger Name mit Namensraum, z.B. ‘EulandaXtools.RegHiveApi’. Existiert der Typ schon, wird er unverändert zurückgegeben - das ist der Guard gegen Import-Module -Force und Mehrfach-Laden über Plugin-Ketten.
-Method #
Type: hashtable[]
Je Methode eine Hashtable:
Name Name der Methode in PowerShell (Pflicht) Dll DLL-Name, z.B. ‘advapi32.dll’ (Pflicht) ReturnType Rückgabetyp, z.B. [int] (Pflicht) Parameter Typen der Parameter als [type[]]; für out und ref den Typ mit .MakeByRefType() angeben (Pflicht, darf leer sein) EntryPoint Abweichender Name in der DLL, z.B. ‘RegLoadAppKeyW’ CharSet Vorgabe Unicode
HINWEISE #
Was dieser Weg NICHT kann: eigene Logik, Strukturen mit [StructLayout], Delegaten, Konstanten. Wo die C#-Quelle mehr enthält als Deklarationen - Send-MapiMail etwa braucht Strukturen - bleibt Add-Type. Diese Stellen sind aber alle innerhalb einer Funktion und übersetzen deshalb erst beim Aufruf, nicht beim Import.
SetLastError gibt es hier bewusst nicht. Reflection.Emit bietet den Schalter nicht an, und die Registry-Funktionen liefern ihren Fehlercode ohnehin als Rückgabewert (LSTATUS) statt über GetLastWin32Error. Wer eine API anbindet, die den letzten Fehler wirklich über Marshal.GetLastWin32Error meldet, nimmt weiterhin Add-Type.