【问题标题】:C++/CLI: How do I use the CallerMemberNameAttribute in C++/CLI?C++/CLI:如何在 C++/CLI 中使用 CallerMemberNameAttribute?
【发布时间】:2016-04-08 12:20:12
【问题描述】:

在 C# 和 VB.Net 中,我可以使用 CallerMemberNameAttribute 将调用者的名称作为字符串获取:

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

我想在 C++/CLI 中做同样的事情,但不知何故我无法让它工作。尝试了几种结构,我开始怀疑 C++/CLI 编译器是否支持这个属性。

这是一个(简化的)实现:

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

在 C# 应用程序中调用此方法时,name 的值为 null。也尝试使用属性 DefaultParameterValue 但它也没有帮助。现在没有想法了。

显而易见的答案是,为什么不在 C# 中实现呢? 好吧,在这种特定情况下,我仅限于 C++/CLI。

【问题讨论】:

  • 尝试没有意义,这在 C++ 编译器中没有实现。 C++/CLI 在 2005 年被冻结。您必须使用 StackTrace class
  • 请注意,Hans 的建议意味着严重的性能损失。

标签: c++-cli optional-parameters callermembername


【解决方案1】:

我使用反射器查看了 C++/CLI 和 C#/VB.Net 版本之间的差异,它们看起来完全一样。

然后使用了 ILDASM,现在我想我知道为什么它不起作用了(在阅读了这个 post 之后)。

这是il代码:

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

来自 VB.Net 的 IL 代码与 C# 的不同之处如下:

.param [1] = nullref

我怀疑因为 C++/CLI 发出 DefaultParameterValue 而不是使用默认值初始化 .param[1],所以 C# 编译器不会将该值转换为调用者成员名称。

如果 MSDN 页面描述了 C++/CLI 项目的此类限制,将会很方便。会为我们节省很多时间。

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多