5

動作しないように思われるコードがあるため、この質問をするのは少し奇妙ですが、動作します。不満はありませんが、理由を確認したいですか? 笑

簡単に言えば、C# コードからコールバックを受け取る C++ ネイティブ DLL (CLR/マネージ サポートはまったくない) があります。ネイティブ側は、C# 側によって提供される stdcall コールバック関数を格納します。コールバック METHOD (C# の場合) は静的でなければならないといつも思っていましたが、非静的とラムダ式の両方が正常に機能します!? 「this」ポインタはネイティブコードからどのようにマーシャリングされていますか? ネイティブ コードは非インスタンス関数ポインターのみを格納するといつも思っていました。

さて、ある人が IL コードを発行して、ネイティブと非静的マネージド コールバックの間を「ブリッジ」するという記事を見つけました。また、この廃止されたメソッド「Marshal.GetUnmanagedThunkForManagedMethodPtr()」にも気付きました。このメソッドはサポートされなくなりましたが、これは組み込まれていることを意味していると思いますか?

質問の要約:

  1. thunking は、IL コードを発行することによって .NET にネイティブに組み込まれるようになりましたか? もしそうなら、どのバージョンの .NET でこれがネイティブにサポートされましたか?

  2. 暗黙の「サンク」は Mono でもサポートされていますか?

  3. IL がマネージ コールバックに対して発行される場合、サンクが参照するインスタンスが削除されるとどうなりますか? IL は削除されていますか、それとも、いわばメモリの「リーク」につながる可能性がありますか?

ありがとう。

4

2 に答える 2

2

サンクは、IL コードを発行することによって .NET にネイティブに組み込まれるようになりましたか? もしそうなら、どのバージョンの .NET でこれがネイティブにサポートされましたか?

サンクには IL は関与しません。ネイティブ コードを発行することによって発生します。トランポリンはthis、閉じたデリゲートの場合に保存されるポインターを含め、.NET の呼び出し規則を満たすように引数を再配置し、.NET への末尾呼び出しを実行します。メソッド自体。

暗黙の「サンク」は Mono でもサポートされていますか?

これは「reverse p/invoke」と呼ばれ、Mono ドキュメントで簡単に検索できるはずです。

IL がマネージ コールバックに対して発行される場合、サンクが参照するインスタンスが削除されるとどうなりますか?

デリゲートがガベージ コレクションされると、トランポリンによって使用されたメモリも解放されます。そのため、ネイティブ コードにトランポリンへのポインターがある限り、デリゲートを有効にしておく必要があります。

于 2013-03-27T18:17:21.917 に答える
1

相互運用マーシャラーは、単にデリゲートをマーシャリングします。デリゲートは、クラス デリゲート ( no this) またはインスタンス デリゲート ( を持つ)のいずれかthisです。C# の観点からは、デリゲートを呼び出しているだけです。つまり、インスタンス デリゲートを管理するために使用されるのと同じセマンティクスthis(クラス インスタンスの分離など) が効果的に使用されます。

明らかに、他のこと (ピン留めなど) の裏でさらに多くのことが行われていますが、それらは通常、あなたが尋ねたこととは無関係です。

于 2013-03-27T18:15:34.900 に答える