2016-04-08 63 views
1

私は文字列として呼び出し元の名前を取得するためにCallerMemberNameAttributeを使用することができますC#とVB.Netで:私はC++/CLIで同じことをしたいと思っ何とか、私はそれを得ることができないC++/CLI:C++/CLIでCallerMemberNameAttributeを使用するにはどうすればよいですか?

public void Caller([CallerMemberName]string memberName = "") 
{ 
    Debug.Print(memberName); 
} 

ワーキング。いくつかの構造を試してみましたが、私はC++/CLIコンパイラがこの属性をサポートしているかどうか疑問に思っています。ここ

は(簡体字)の実装である:C#アプリケーションでこのメソッドを呼び出すとき

using namespace System::Runtime::CompilerServices; 
public ref class InvokeExample 
{ 
    Invoke([CallerMemberName][Optional]String^ name) 
    { 
     Debug::Print(name); 
    } 
} 

名前の値がヌルです。また、属性DefaultParameterValueで試してみましたが、どちらも役に立ちませんでした。今、アイデアが不足しています。

明白な答えは、なぜC#で実装しないのでしょうか? この特定のケースでは、私はC++/CLIに限定されています。

+0

試しても意味がありませんが、これはC++コンパイラでは実装されていません。 C++/CLIは2005年にフリーズされました。[StackTraceクラス](http://stackoverflow.com/a/2652591/17034)を使用する必要があります。 –

+0

ハンスの提案は、パフォーマンス上の厳しいペナルティを意味することに注意してください。 –

答えて

1

私はC++/CLIとC#/ VB.Netの違いを見るためにリフレクターを使用しましたが、まったく同じように見えました。

ILDASMを使用していますが、なぜこれが機能しないのかがわかりました(このpostを読んだ後)。

ここILコードです:次のようにVB.Netから

C++/CLI

.method public hidebysig instance string 
     Caller([opt] string methodName) cil managed 
{ 
    .param [1] 
    .custom instance void [System]System.Runtime.InteropServices.DefaultParameterValueAttribute::.ctor(object) = (01 00 0E 00 00 00) 
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CallerMemberNameAttribute::.ctor() = (01 00 00 00) 
    // Code size  2 (0x2) 
    .maxstack 1 
    IL_0000: ldarg.1 
    IL_0001: ret 
} // end of method ClassCPP::Caller 

C#

.method public hidebysig instance string 
     Caller([opt] string methodName) cil managed 
{ 
    .param [1] = "" 
    .custom instance void [mscorlib]System.Runtime.CompilerServices.CallerMemberNameAttribute::.ctor() = (01 00 00 00) 
    // Code size  2 (0x2) 
    .maxstack 1 
    .locals init ([0] string CS$1$0000) 
    IL_0000: ldarg.1 
    IL_0001: ret 
} // end of method ClassCS::Caller 

ILコードは、C#とは異なります

.param [1] = nullref 

私は、C++/CLIデフォルト値で.param [1]を初期化する代わりにDefaultParameterValueを発行します.C#コンパイラは、値を呼び出し元メンバ名に変換しません。

MSDNのページでC++/CLIプロジェクトの制限が記述されていると便利でしょう。私たちに多くの時間を節約するでしょう。

関連する問題