C# 编译C++/用于.Net的CLI

C# 编译C++/用于.Net的CLI,c#,c++-cli,ildasm,C#,C++ Cli,Ildasm,在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); even

在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#事件:


这个问题并没有暗示真正的问题,我也没法得到一个答复。但后来意识到可能发生的事情,C++编译器不同于其他托管编译器,以及MSIL,它不需要在声明中命名参数。结果是:

namespace CppClassLibrary {
    public ref class Example {
    public:
        delegate void Blah(int, int, int, int);
        event Blah^ Foo;
    };
}
在C#中生成此自动生成的事件处理程序:


看起来像是一个令人震惊的解释。您只是忘记了在委托声明中命名参数,C++编译器被迫合成它们以编写正确的MSIL。当然很容易修复。

MSIL有什么区别?(在两者上都使用
ildasm
)无需复制。我想你应该把VS版本记录下来。我之前的评论仍然有效。另外,共享编译设置,特别是您是否正在生成调试信息。@BenVoigt添加了ildasmyeap,问题是我的名称在raise事件中,而不是在委托中。在答案中添加解决方案的示例
namespace CppClassLibrary {
    public ref class Example {
    public:
        delegate void Blah(int, int, int, int);
        event Blah^ Foo;
    };
}
    void test_Foo(int A_0, int A_1, int A_2, int A_3) {
        throw new NotImplementedException();
    }