編集:私は結果をブログ投稿として書きました。
C#コンパイラは、COMタイプを魔法のように扱います。たとえば、このステートメントは正常に見えます...
Word.Application app = new Word.Application();
...それがApplication
インターフェースであることを理解するまで。インターフェイスのコンストラクターを呼び出しますか?ヨイクス!これは実際にはへの呼び出しとへの呼び出しに変換さType.GetTypeFromCLSID()
れActivator.CreateInstance
ます。
さらに、C#4では、ref
パラメーターに非ref引数を使用でき、コンパイラーはローカル変数を追加して参照渡しし、結果を破棄します。
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(うん、たくさんの引数が足りません。オプションのパラメーターはいいのではないですか?:)
私はコンパイラの動作を調査しようとしています、そして私は最初の部分を偽造することに失敗しています。私は問題なく2番目の部分を行うことができます。
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);
}
}
私は書くことができるようにしたいと思います:
Dummy dummy = new Dummy();
でも。もちろん、実行時に実行されますが、それで問題ありません。実験中です。
リンクされたCOM PIA(CompilerGenerated
およびTypeIdentifier
)のコンパイラーによって追加された他の属性は、トリックを実行していないようです...魔法のソースは何ですか?
dynamic
です。COM以外で重要である理由を確認するために静的/強力な型付けに慣れすぎています。