EDIT: j'ai écrit les résultats comme un billet de blog.
Le compilateur C# traite les types de COM un peu comme par magie. Par exemple, cette déclaration semble normal...
Word.Application app = new Word.Application();
... jusqu'à ce que vous vous rendez compte que Application
est une interface. Appel d'un constructeur sur une interface? Yoiks! Ce fait se traduit dans un appel à l' Type.GetTypeFromCLSID()
et un autre pour Activator.CreateInstance
.
En outre, en C# 4, vous pouvez utiliser la non-réf arguments pour ref
paramètres, et le compilateur ajoute simplement une variable locale à passer par référence, en écartant les résultats:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Oui, il y a un tas d'arguments manquants. Ne sont pas des paramètres optionnels de nice? :)
Je suis en train d'étudier le comportement du compilateur, et je ne suis pas pour de faux la première partie. Je peux faire la deuxième partie avec pas de 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 être capable d'écrire:
Dummy dummy = new Dummy();
cependant. Évidemment, ça va aller bang au moment de l'exécution, mais c'est correct. Je suis juste à expérimenter.
Les autres attributs ajouté par le compilateur pour lié COM Pia (CompilerGenerated
et TypeIdentifier
) ne semblent pas faire l'affaire... ce qui est la magie de la sauce?