如何在托管C ++中处理托管事件(c#)

时间:2015-02-18 12:21:23

标签: c# c#-4.0 c++-cli

我们有一个用托管C ++(C ++ / CLI)编写的应用程序,它使用另一个用C#编写的库。将从托管代码引发一个事件,我们希望在托管C ++代码中处理该事件。

管理C#活动代码

using System;

namespace CSharpWithEvent
{

    public class UpdateInfo
    {
        public string PropertyName { get; set; }
        public int NewValue { get; set; }
    }

    public class ValueChangeEventArgs : EventArgs
    {
        private UpdateInfo _updatePacket;

        public UpdateInfo UpdatePacket
        {
            get { return _updatePacket; }
            set { _updatePacket = value; }
        }
        public ValueChangeEventArgs(UpdateInfo updatePacket)
        {
            _updatePacket = updatePacket;
        }
    }
    public class ImageManager
    {
        private EventHandler<ValueChangeEventArgs> _onValueChanged;
        public event EventHandler<ValueChangeEventArgs> OnValueChanged
        {
            add { _onValueChanged += value; }
            remove { _onValueChanged -= value; }
        }

        /// <summary>
        /// Method that is called to update Image.
        /// </summary>
        /// <param name="updatePacket"></param>
        public void UpdateImage(UpdateInfo updatePacket)
        {
            /*Raised Event*/
            if (_onValueChanged != null)
            {
                _onValueChanged(this, new ValueChangeEventArgs(updatePacket));
            }
        }
    }
}

ImageUserClass.h的代码

#pragma once
#include "stdafx.h"
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace CSharpWithEvent;

class ImageUserClass
{
public:
    gcroot<ImageManager^> m_imageManager;
    ImageUserClass();
    void OnImageValueChange(Object^ sender, ValueChangeEventArgs^ updatePacket);
};

托管.cpp文件中的处理程序代码

#include "stdafx.h";
#include "ImageUserClass.h";

ImageUserClass::ImageUserClass()
{
    m_imageManager = gcnew ImageManager();
    m_imageManager->OnValueChanged += gcnew EventHandler<ValueChangeEventArgs^>(this, &ImageUserClass::OnImageValueChange);
}
void ImageUserClass::OnImageValueChange(Object^ sender, ValueChangeEventArgs^ updatePacket)
{
    //TODO: Make necessary changes.
}

我已经实现并尝试处理该事件,但我收到了以下错误。

错误1错误C3364:'System :: EventHandler':委托构造函数的参数无效;委托目标需要是指向成员函数的指针

请帮我解决上述问题

0 个答案:

没有答案