1

In C# I can get Visual Studio to keep the delegate's argument names.
For example if I have:

public delegate void Blah(object myArg);
public event Blah Foo;

Then when I add a method to the event, Visual Studio UI automatically keeps the names and creates the method:

void Form1_Foo(object myArg);

But, if I declare a delegate in C++/CLI:

public:
delegate void Blah(Object^ myArg);
event Blah^ Foo;

it doesn't keep the names and creates a method with nonsense names:

void Form1_Foo(object A_0)

How can I set meaningful names to the argument in C++/CLI ?

EDIT (Added ildasm results):

C++ CLI event:

.method public hidebysig specialname instance void 
        Invoke(object myArg) cil managed
{
} // end of method Blah::Invoke

C# event:

.method public hidebysig newslot virtual 
        instance void  Invoke(object myArg) runtime managed
{
} // end of method Blah::Invoke
leppie
  • 115,091
  • 17
  • 196
  • 297
Yochai Timmer
  • 48,127
  • 24
  • 147
  • 185

1 Answers1

3

The question has no hint at the real problem and I could not get a repro. But later realized what might be happening, the C++ compiler is different from other managed compilers, and MSIL, it doesn't require parameters to be named in declarations. That panned out:

namespace CppClassLibrary {
    public ref class Example {
    public:
        delegate void Blah(int, int, int, int);
        event Blah^ Foo;
    };
}

Produces this auto-generated event handler in C#:

    void test_Foo(int A_0, int A_1, int A_2, int A_3) {
        throw new NotImplementedException();
    }

Looks like a slamdunk explanation. You simply forgot to name the parameters in the delegate declaration, the C++ compiler is forced to synthesize them in order to write correct MSIL. Easy to fix of course.

Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
  • yeap, problem was i had the names in the raise event, not in the delegate. Add an example of the solution in the answer – Yochai Timmer Sep 05 '14 at 23:36