簡體   English   中英

C ++ / CLI-回調到C#

[英]C++/CLI - callback to C#

我已經把這個問題解決了。 我正在使用第三方市場數據DLL,並且此連接由類CManager管理。 然后,將其包裝在類CManagerWrapper中,如下所示。

// clr.cpp

    #include <windows.h>  
    #using <System.dll>

    using namespace System;

    class CManager
    {
    public:
        CManager() {}
        ~CManager() {}
    };

    public ref class CManagerWrapper {
    public:
        CManagerWrapper() : m_Impl(new CManager) {}
        ~CManagerWrapper() {
            delete m_Impl;
        }

    public:
        typedef void(__stdcall *Callbackfunc)(int);
        void TestCallBack(Callbackfunc cbf)
        {
            cbf(2);
        }

    private:
        CManager * m_Impl;
    };

C ++程序被編譯為DLL(CLR控制台應用程序),並在以下C#項目中引用。

using System;
using System.Runtime.InteropServices;

namespace main
{
    class Program
    {

        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
        delegate void CallbackFunc(int value);

        static void Main(string[] args)
        {

            CallbackFunc callback =
                (value) =>
                {
                    Console.WriteLine("Callback value = {0}", value);
                };

            CManagerWrapper mw = new CManagerWrapper();

            mw.TestCallBack(Marshal.GetFunctionPointerForDelegate(callback));

        }
    }
}

我將需要管理一些回調,因此我的第一個選項是獲取指向回調函數的指針,該指針指向托管類。 問題在於C#端無法識別該類的TestCallBack()方法。 它根本看不到它。 當我創建帶有簡單參數的其他方法時,它們很好,但是由於函數指針參數,它不喜歡此函數。

error CS0570: 'CManagerWrapper.TestCallBack(?)' is not supported by the language

有人可以告訴我我在做什么傻嗎? 我可能在C ++和C#之間需要一層嗎?

由於您使用的是C ++ / cli,因此可以使用所有.NET(和托管)代碼功能。 例如,使用ActionDelegate代替本機函數指針。

代碼示例:

testclass.h文件

#pragma once

#using <System.dll>

using namespace System;

class NativeClass
{
public:
    NativeClass();
    ~NativeClass();
};
namespace Managed
{
    // delegate declaration as in simple C# code
    public delegate void ManagedCallbackHandler(int);

    public ref class ManagedClass
    {
    public:
        ManagedClass();
        ~ManagedClass();

        // call this directly from c# with method adequate to the action
        void TestCallBack(Action<int>^);
        // call this directly from C# with method adequate to the handler
        void TestCallBack2(ManagedCallbackHandler^);

    private:
        NativeClass * m_native;
    };
}

testclass.cpp文件

#include "TestClass.h"

NativeClass::NativeClass() { }
NativeClass::~NativeClass() { }

Managed::ManagedClass::ManagedClass() : m_native(new NativeClass) { }
Managed::ManagedClass::~ManagedClass() { delete m_native; }

void Managed::ManagedClass::TestCallBack(System::Action<int>^ cbf)
{
    cbf(2);
}

void Managed::ManagedClass::TestCallBack2(Managed::ManagedCallbackHandler^ cbf)
{
    cbf(2);
}

將其構建為庫(.DLL),並從C#應用程序中引用它。 然后只需使用:

class Program
{
    static void Main(string[] args)
    {
        Managed.ManagedClass c = new Managed.ManagedClass();
        // call using Action<int>
        c.TestCallBack(Console.WriteLine);
        // call using ManagedCallbackHandler
        c.TestCallBack2(Console.WriteLine);
        Console.ReadLine();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM