編集:私は結果をblog postとして書いています。C#コンパイラはどのようにCOMタイプを検出しますか?
C#コンパイラは、COMの種類をやや魔法のように扱います。例えば、この文は正常に見える...
Word.Application app = new Word.Application();
...あなたはApplication
インターフェイスであることを認識するまで。インターフェイス上でコンストラクタを呼び出すYoiks!これは実際にType.GetTypeFromCLSID()
へのコールに変換され、もう1つはActivator.CreateInstance
へのコールに変換されます。
また、C#4で、あなたはref
のパラメータの非参照引数を使用することができ、コンパイラは結果だけを破棄、参照によって渡すためにローカル変数を追加します。
// FileName parameter is *really* a ref parameter
app.ActiveDocument.SaveAs(FileName: "test.doc");
(うん、あります私はコンパイラの動作を調べようとしています。私は最初の部分を偽造することに失敗しています。
Dummy dummy = new Dummy();
をしかし:私は書くことができるようにしたいと思い
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);
}
}
:私は問題なしとの第二の部分を行うことができます。明らかに、それは実行時に強打するだろうが、それは大丈夫です。私はただ実験しているだけです。
リンクされたCOM PIA(CompilerGenerated
およびTypeIdentifier
)用にコンパイラによって追加された他の属性は、トリックを実行していないようです...マジックソースは何ですか?
あなたは私にこのようなもの(ほとんどのもの)を先取りしていますが、clairificationのためには、より正規化された構文の依存性注入機能が正しいと思います。 –
オプションパラメータはいいですか? IMO、いいえ、彼らは素敵じゃない。 Microsoftは、C#にbloatを追加することで、Office COMインターフェイスの欠陥を修正しようとしている。 –
良い質問(+1)。私はインターフェイス上でコンストラクタを呼び出すことについて同じことに気付きました。何が起きているかに精通していない開発者を本当に混乱させるので、コードでは恐ろしいように見えます。私はいつもそれが働くようにシーンの裏に何が起こっているのか疑問に思っていました。あなたの新しい本を買うように見えます;-) –