EDIT: J'ai écrit les résultats sous forme de blog .
Le compilateur C # traite les types COM de manière un peu magique. Par exemple, cette déclaration semble normale ...
Word.Application app = new Word.Application();
... jusqu'à ce que vous vous rendiez compte que Application
c'est une interface. Appel d'un constructeur sur une interface? Yoiks! Cela se traduit en fait par un appel à Type.GetTypeFromCLSID()
et un autre à Activator.CreateInstance
.
De plus, en C # 4, vous pouvez utiliser des arguments non-ref pour les ref
paramètres, et le compilateur ajoute simplement une variable locale à passer par référence, en ignorant les résultats:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Ouais, il manque un tas d'arguments. Les paramètres optionnels ne sont-ils pas sympas? :)
J'essaie d'enquêter sur le comportement du compilateur et je n'arrive pas à simuler la première partie. Je peux faire la deuxième partie sans problème:
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);
}
}
J'aimerais pouvoir écrire:
Dummy dummy = new Dummy();
bien que. Évidemment, ça va aller au moment de l'exécution, mais ce n'est pas grave. J'expérimente juste.
Les autres attributs ajoutés par le compilateur pour les PIA COM liés ( CompilerGenerated
et TypeIdentifier
) ne semblent pas faire l'affaire ... quelle est la sauce magique?
dynamic
... nous sommes trop habitués au typage statique / fort pour voir pourquoi cela importerait en dehors de COM.