Manuale di riferimento MALDA™

Il linguaggio di programmazione AI-First - Versione 1.0.11

30. Interop .NET

MALDA offre il supporto nativo al caricamento e all'uso di librerie .NET esterne, e così consente di accedere al vasto ecosistema .NET: pacchetti NuGet, class library personalizzate e API del framework. I programmi MALDA possono riusare codice .NET esistente senza riscriverlo.

30.1 Tipi già nel runtime

Non ti serve una DLL personalizzata per i tipi BCL di base. Passa il nome completamente qualificato a dotnetNew o getDotNetType. I tipi generici usano l'arietà con backtick: List`1 significa List<T> con un parametro di tipo.

var sb = dotnetNew("System.Text.StringBuilder");
sb.Append("hello");
sb.Append(" ");
sb.Append("MALDA");
print(sb.ToString());

30.2 Caricamento degli assembly .NET

loadAssembly(pathOrName)

Carica un assembly .NET da un path di file o per nome di assembly.

Sintassi

var asm = loadAssembly("path/to/library.dll");
var asm = loadAssembly("System.Data");  // Load by assembly name

Parametri

Valore restituito

Comportamento

Esempio

// Load from file path
var customLib = loadAssembly("C:\\MyLibs\\MyLibrary.dll");

// Load by assembly name (from GAC or already loaded)
var systemData = loadAssembly("System.Data");

30.3 Ottenere i tipi .NET

getDotNetType(assembly, typeName) or getDotNetType(fullTypeName)

Recupera un tipo .NET da un assembly o da tutti gli assembly caricati.

Sintassi

// From a specific assembly
var type = getDotNetType(asm, "MyNamespace.MyClass");

// From any loaded assembly (searches all loaded assemblies)
var type = getDotNetType("System.Collections.Generic.List`1");

Parametri

Valore restituito

Esempio

var asm = loadAssembly("MyLibrary.dll");
var myClassType = getDotNetType(asm, "MyLibrary.MyClass");

// Or search all loaded assemblies
var listType = getDotNetType("System.Collections.Generic.List`1");
Nota: Per i tipi generici usa la notazione con backtick (es. List`1 per List<T>). Il numero dopo il backtick indica il numero di parametri di tipo.

30.4 Creare oggetti .NET

dotnetNew(typeOrTypeName, ...ctorArgs)

Crea una nuova istanza di un tipo .NET.

Sintassi

var obj = dotnetNew(typeHandle);
var obj = dotnetNew(typeHandle, arg1, arg2);  // With constructor arguments
var obj = dotnetNew("System.Text.StringBuilder");  // Direct from type name

Parametri

Valore restituito

Esempio

// Using type handle
var type = getDotNetType(asm, "MyLibrary.MyClass");
var instance = dotnetNew(type);

// With constructor arguments
var instance2 = dotnetNew(type, "arg1", 42);

// Direct from type name
var sb = dotnetNew("System.Text.StringBuilder");

30.5 Usare gli oggetti .NET

Una volta creata un'istanza .NET, puoi:

Conversione di tipo

MALDA converte automaticamente tra tipi MALDA e tipi .NET:

Esempio

// Load assembly and create instance
var asm = loadAssembly("C:\\path\\to\\TestLib.dll");
var fooType = getDotNetType(asm, "TestLib.Foo");
var foo = dotnetNew(fooType);

// Call instance method
var sum = foo.Add(2, 3);
print("2 + 3 = " + string(sum));

// Access and set properties
foo.Name = "from MALDA";
print("Foo.Name = " + foo.Name);

// Use a BCL type already loaded (no custom DLL)
var sb = dotnetNew("System.Text.StringBuilder");
sb.Append("item1");
sb.Append("item2");
print("Length: " + string(sb.Length));

Callback native

createNativeCallback(fn) wrappa una funzione MALDA così da poterla passare a codice .NET che si aspetta un delegate, per esempio un event handler o un parametro di callback su un oggetto di interop. L'argomento deve essere un valore funzione; qualsiasi altro tipo solleva un errore.

var callback = createNativeCallback((value) => {
    print("called back with " + value);
});

nativeObject.onChanged(callback);

30.6 Usare i pacchetti NuGet

Per usare pacchetti NuGet in MALDA:

  1. Crea una .NET Class Library che referenzia il pacchetto NuGet
  2. Compila la library per generare un file .dll
  3. Carica l'assembly in MALDA con loadAssembly()
  4. Usa i tipi del pacchetto tramite getDotNetType() e dotnetNew()

Flusso di lavoro di esempio

// Load a library that uses a NuGet package (e.g., Newtonsoft.Json)
var jsonLib = loadAssembly("C:\\MyLibs\\JsonHelper.dll");
var jsonHelperType = getDotNetType(jsonLib, "JsonHelper.JsonProcessor");
var processor = dotnetNew(jsonHelperType);

// Use the library
var result = processor.ProcessJson(jsonString);

30.7 Esempio completo

// Example: Using a custom .NET library
var asmPath = "C:\\MyLibraries\\MathUtils.dll";
var asm = loadAssembly(asmPath);

// Get a type from the library
var calculatorType = getDotNetType(asm, "MathUtils.Calculator");
var calc = dotnetNew(calculatorType);

// Use the calculator
var result = calc.Add(10, 20);
print("10 + 20 = " + string(result));

// Access properties
calc.Precision = 5;
print("Precision set to: " + string(calc.Precision));

30.8 Note di implementazione

30.9 Casi d'uso

Vedi anche