在为.Net编译C ++ / CLI时保留委托参数名称
在C#中,我可以使用Visual Studio来保留委托的参数名称。
例如,如果我有:
public delegate void Blah(object myArg); public event Blah Foo;
然后,当我向事件添加方法时,Visual Studio UI会自动保留名称并创建方法:
void Form1_Foo(object myArg);
但是,如果我在C ++ / CLI中声明一个委托:
public: delegate void Blah(Object^ myArg); event Blah^ Foo;
它不保留名称并创建一个具有无意义名称的方法:
void Form1_Foo(object A_0)
如何在C ++ / CLI中为参数设置有意义的名称?
编辑(添加ildasm结果):
C ++ CLI事件:
.method public hidebysig specialname instance void Invoke(object myArg) cil managed { } // end of method Blah::Invoke
C#事件:
.method public hidebysig newslot virtual instance void Invoke(object myArg) runtime managed { } // end of method Blah::Invoke
问题没有暗示真正的问题,我无法得到一个复制品。 但后来意识到可能发生的事情,C ++编译器与其他托管编译器和MSIL不同,它不需要在声明中命名参数。 淘汰出局:
namespace CppClassLibrary { public ref class Example { public: delegate void Blah(int, int, int, int); event Blah^ Foo; }; }
在C#中生成此自动生成的事件处理程序:
void test_Foo(int A_0, int A_1, int A_2, int A_3) { throw new NotImplementedException(); }
看起来像一个灌篮的解释。 您只是忘记在委托声明中命名参数,C ++编译器被强制合成它们以便编写正确的MSIL。 当然容易修复。