EDIT: Saya sudah menulis hasilnya sebagai posting blog .
Compiler C # memperlakukan tipe COM agak ajaib. Misalnya, pernyataan ini terlihat normal ...
Word.Application app = new Word.Application();
... sampai Anda menyadari bahwa itu Application
adalah antarmuka. Memanggil konstruktor pada antarmuka? Yoiks! Ini sebenarnya diterjemahkan ke dalam panggilan ke Type.GetTypeFromCLSID()
dan ke lainnya Activator.CreateInstance
.
Selain itu, dalam C # 4, Anda dapat menggunakan argumen non-ref untuk ref
parameter, dan kompilator hanya menambahkan variabel lokal untuk lulus dengan referensi, membuang hasil:
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(Ya, ada banyak argumen yang hilang. Tidakkah parameter opsional bagus? :)
Saya mencoba untuk menyelidiki perilaku kompiler, dan saya gagal memalsukan bagian pertama. Saya dapat melakukan bagian kedua tanpa masalah:
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);
}
}
Saya ingin dapat menulis:
Dummy dummy = new Dummy();
meskipun. Jelas itu akan meledak pada waktu eksekusi, tapi tidak apa-apa. Saya hanya bereksperimen.
Atribut lain yang ditambahkan oleh kompiler untuk COM PIA ( CompilerGenerated
dan TypeIdentifier
) tampaknya tidak melakukan trik ... apa saus ajaibnya?
dynamic
... kita terlalu terbiasa mengetik statis / kuat untuk melihat mengapa itu penting di luar COM.