Запуск событий в C ++ и обработка их в C # - PullRequest
0 голосов
/ 04 июня 2018

У меня есть промышленный компьютер с некоторыми выводами цифрового ввода / вывода.Производитель предоставляет некоторые библиотеки C ++ и примеры для обработки изменения состояния выводов.

Мне нужно интегрировать эти события в приложение C #.AFAIK самый простой способ сделать это:

  1. Создать управляемую оболочку C ++ / CLI для библиотек производителей, которая генерирует события, когда прерывания выдаются из выводов DIO.
  2. Оберните и обработайте события в части C # так, как если бы они были обычными событиями C #.

Я попытался сделать это с некоторыми фиктивными объектами, но безуспешно.Из документов, функция EventHandler должна выполнять большую часть «грязной работы» в моем случае.Следующая информация, доступная в старых потоках и пример EventHandler в документах MSDN, я закончил с этим тестовым кодом:

C ++ / CLI

using namespace System;

public ref class ThresholdReachedEventArgs : public EventArgs
{
public:
    property int Threshold;
    property DateTime TimeReached;
};

public ref class CppCounter
{
private:
    int threshold;
    int total;

public:
    CppCounter() {};

    CppCounter(int passedThreshold)
    {
        threshold = passedThreshold;
    }

    void Add(int x)
    {
        total += x;
        if (total >= threshold) {
            ThresholdReachedEventArgs^ args = gcnew ThresholdReachedEventArgs();
            args->Threshold = threshold;
            args->TimeReached = DateTime::Now;
            OnThresholdReached(args);
        }
    }

    event EventHandler<ThresholdReachedEventArgs^>^ ThresholdReached;

protected:
    virtual void OnThresholdReached(ThresholdReachedEventArgs^ e)
    {
        ThresholdReached(this, e);
    }
};

public ref class SampleHandler
{
public:
    static void c_ThresholdReached(Object^ sender, ThresholdReachedEventArgs^ e)
    {
        Console::WriteLine("The threshold of {0} was reached at {1}.",
            e->Threshold, e->TimeReached);
        Environment::Exit(0);
    }
};

void main()
{
    return;
    CppCounter^ c = gcnew CppCounter(20);
    c->ThresholdReached += gcnew EventHandler<ThresholdReachedEventArgs^>(SampleHandler::c_ThresholdReached);

    Console::WriteLine("press 'a' key to increase total");
    while (Console::ReadKey(true).KeyChar == 'a') {
        Console::WriteLine("adding one");
        c->Add(1);
    }
}

C #

using System;

namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {
        CppCounter cc = new CppCounter(5);
        //cc.ThresholdReached += cs_ThresholdReached; //<--This is the offending line


        Console.WriteLine("press 'a' key to increase total");
        while (Console.ReadKey(true).KeyChar == 'a')
        {
            Console.WriteLine("adding one");
            cc.Add(1);
        }
    }

    static void cs_ThresholdReached(object sender, ThresholdReachedEventArgs e)
    {
        Console.WriteLine("The threshold of {0} was reached at {1}.", e.Threshold, e.TimeReached);
        Environment.Exit(0);
    }
}

class Counter
{
    private int threshold;
    private int total;

    public Counter(int passedThreshold)
    {
        threshold = passedThreshold;
    }

    public void Add(int x)
    {
        total += x;
        if (total >= threshold)
        {
            ThresholdReachedEventArgs args = new ThresholdReachedEventArgs();
            args.Threshold = threshold;
            args.TimeReached = DateTime.Now;
            OnThresholdReached(args);
        }
    }

    protected virtual void OnThresholdReached(ThresholdReachedEventArgs e)
    {
        EventHandler<ThresholdReachedEventArgs> handler = ThresholdReached;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    public event EventHandler<ThresholdReachedEventArgs> ThresholdReached;
}

  public class ThresholdReachedEventArgs : EventArgs
    {
        public int Threshold { get; set; }
        public DateTime TimeReached { get; set; }
    }
}

Что я делаю не так?Мне чего-то не хватает?

1 Ответ

0 голосов
/ 04 июня 2018
  public class ThresholdReachedEventArgs : EventArgs

Код правильный, за исключением этого незначительного сбоя.Вы случайно повторно объявили этот класс в своем коде C #.Теперь есть два , один из вашего C ++ / CLI проекта и другой из вашего C # проекта.Это проблема, идентичность типа в .NET определяется не только именем пространства имен и именем класса, но также включает сборку, из которой она получена.

Так что это два разных типа, компилятор пытается вам сказатьчто версия C # это не правильная.То, что они имеют одно и то же имя, не совсем помогает вам декодировать сообщение об ошибке:)

Очень легко исправить, просто удалите объявление класса из вашего кода C #.Теперь компилятор будет использовать его версию на C ++ / CLI.

...