EDITAR: He escrito los resultados como blog post.¿Cómo detecta el compilador C# los tipos COM?
El compilador de C# trata a tipos COM algo mágico. Por ejemplo, esta afirmación parece normal ...
Word.Application app = new Word.Application();
... hasta que se da cuenta de que Application
es una interfaz. ¿Llamar a un constructor en una interfaz? Yoiks! Esto en realidad se traduce en una llamada a Type.GetTypeFromCLSID()
y otra a Activator.CreateInstance
.
Además, en C# 4, puede utilizar argumentos que no sean árbitro para ref
parámetros, y el compilador simplemente añade una variable local para pasar por referencia, descartando los resultados:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Sí, hay falta un montón de argumentos. ¿No son agradables los parámetros opcionales? :)
Estoy tratando de investigar el comportamiento del compilador, y estoy fallando en falsificar la primera parte. Puedo hacer la segunda parte sin ningún problema:
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
[ComImport, GuidAttribute("00-0000-0000-0000-000000000011")]
public interface Dummy
{
void Foo(ref int x);
}
class Test
{
static void Main()
{
Dummy dummy = null;
dummy.Foo(10);
}
}
me gustaría ser capaz de escribir:
Dummy dummy = new Dummy();
sin embargo. Obviamente va a explotar en el momento de la ejecución, pero está bien. Solo estoy experimentando.
Los otros atributos agregados por el compilador para PIA COM vinculados (CompilerGenerated
y TypeIdentifier
) no parecen hacer el truco ... ¿cuál es la salsa mágica?
Estás muy por delante de mí en este aspecto (la mayoría de las cosas), pero solo por clairificación, parece que lo que buscas es la funcionalidad de inyección de dependencia con una sintaxis más normalizada. ¿Sería correcto? –
¿No son agradables los parámetros opcionales? OMI, no, no son agradables. Microsoft está intentando reparar el defecto en las interfaces COM de Office agregando bloat a C#. –
Buena pregunta (+1). Me di cuenta lo mismo de llamar a un constructor en una interfaz. Se ve horrible en el código porque realmente confundirá a los desarrolladores que no están familiarizados con lo que está sucediendo. Siempre me pregunté qué estaba pasando detrás de escena para que funcione. Parece que compraré tu nuevo libro ;-) –