[解決済み] C#コンパイラはどのようにCOM型を検出するのですか?
質問内容
EDITです。 として書き上げました。 ブログ記事 .
C#コンパイラは、COM型を多少魔法のように扱います。例えば、この文は普通に見えますが...
Word.Application app = new Word.Application();
...気がつくまで
Application
はインターフェースです。インターフェイスでコンストラクタを呼び出す?ヨイクス! これは、実際には、以下の呼び出しに変換されます。
Type.GetTypeFromCLSID()
と、もうひとつは
Activator.CreateInstance
.
さらに、C# 4 では、非参照の引数で
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
を使ってもうまくいかないようなのですが...何かいい方法があるのでしょうか?
解決方法は?
私は決してこの分野の専門家ではありませんが、最近、あなたが望んでいると思われるものを偶然見つけました。 CoClass 属性のクラスです。
[System.Runtime.InteropServices.CoClass(typeof(Test))]
public interface Dummy { }
コクラスは具体的な を実装したもので、1つ以上の インターフェースです。COM では、このような具象 の実装は、どのようなものでも書くことができます。 COMをサポートするプログラミング言語 コンポーネント開発、例:Delphi, C++、Visual Basicなど。
参照
Microsoft Speech APIに関する同様の質問に対する私の回答です。
で、そのインターフェイスをインスタンス化することができます。
SpVoice
(をインスタンス化しているのです。
SPVoiceClass
).
[CoClass(typeof(SpVoiceClass))]
public interface SpVoice : ISpeechVoice, _ISpeechVoiceEvents_Event { }
関連
-
[解決済み】「The breakpoint will not currently be hit」を改善するには?このドキュメントにはシンボルが読み込まれていません。" という警告はどうすれば改善されますか?
-
[解決済み] 2つのリストを結合する
-
[解決済み] 配置されたアセンブリのマニフェスト定義がアセンブリ参照と一致しない
-
[解決済み] 他のスレッドからGUIを更新するにはどうすればよいですか?
-
[解決済み] C#の[Flags]Enum属性の意味とは?
-
[解決済み] List<T>をオブジェクトのプロパティでソートする方法
-
[解決済み] foreachループの現在の反復処理のインデックスを取得するにはどうすればよいですか?
-
[解決済み] JIT(ジャストインタイム)コンパイラとは、どのようなものですか?
-
[解決済み] なぜC#は汎用属性型を禁止しているのですか?
-
[解決済み] コンパイル・リンクはどのように行われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】 C# 条件演算子エラー 代入、call、increment、decrement、await、new object 式のみ文として使用可能です。
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 関数を終了するには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】Nullableオブジェクトは値を持たなければならない?