EDIT: ho scritto i risultati come post sul blog .
Il compilatore C # tratta i tipi di COM in modo piuttosto magico. Ad esempio, questa affermazione sembra normale ...
Word.Application app = new Word.Application();
... finché non ti rendi conto che Application
è un'interfaccia. Chiamare un costruttore su un'interfaccia? Yoik! Questo in realtà viene tradotto in una chiamata a Type.GetTypeFromCLSID()
e un altro a Activator.CreateInstance
.
Inoltre, in C # 4, è possibile utilizzare argomenti non ref per i ref
parametri e il compilatore aggiunge semplicemente una variabile locale da passare per riferimento, scartando i risultati:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Sì, mancano molti argomenti. I parametri opzionali non sono belli? :)
Sto cercando di indagare sul comportamento del compilatore e non riesco a simulare la prima parte. Posso fare la seconda parte senza problemi:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00012345-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
Mi piacerebbe poter scrivere:
Dummy dummy = new Dummy();
anche se. Ovviamente andrà a sbattere al momento dell'esecuzione, ma va bene. Sto solo sperimentando.
Gli altri attributi aggiunti dal compilatore per le PIA PIA collegate ( CompilerGenerated
e TypeIdentifier
) non sembrano fare il trucco ... qual è la salsa magica?
dynamic
... siamo troppo abituati alla tipizzazione statica / forte per capire perché è importante al di fuori di COM.