从非托管C+运行C#函数+;通过托管C++;包装纸 我正在使用一个封装在DLL中的非托管C++代码的C项目。我必须将DLL加载为引用(而不是DLLIMPART),所以我将一个托管C++封装器作为C语言和DLL之间的桥梁。p>

从非托管C+运行C#函数+;通过托管C++;包装纸 我正在使用一个封装在DLL中的非托管C++代码的C项目。我必须将DLL加载为引用(而不是DLLIMPART),所以我将一个托管C++封装器作为C语言和DLL之间的桥梁。p>,c#,c++,dll,callback,wrapper,C#,C++,Dll,Callback,Wrapper,我可以很容易地从C#调用dll函数,只需从C#调用包装器中的等效函数,然后从包装器中调用dll函数。但是,dll中有一些回调函数应该调用C#函数,而这部分不起作用。我已经学习了一些关于这种互操作的教程(stackoverflow、microsoft、codeproject),但是它们都很老了,我不能让它们工作 其思想是dll正在处理实时数据,每当dll生成一些结果时,它都应该调用Program.cs中的函数,该函数使用这些结果 我正在编写的代码非常庞大,因此我制作了一个非常简单的场景,其中包括所

我可以很容易地从C#调用dll函数,只需从C#调用包装器中的等效函数,然后从包装器中调用dll函数。但是,dll中有一些回调函数应该调用C#函数,而这部分不起作用。我已经学习了一些关于这种互操作的教程(stackoverflow、microsoft、codeproject),但是它们都很老了,我不能让它们工作

其思想是dll正在处理实时数据,每当dll生成一些结果时,它都应该调用Program.cs中的函数,该函数使用这些结果

我正在编写的代码非常庞大,因此我制作了一个非常简单的场景,其中包括所有不起作用的代码

在Program.cs中,我试图告诉dll:“进行此函数测试,完成后调用它”。然后,为了测试它,我强制它运行回调函数。但是我发现了几个错误

虽然wrapper编译并生成wrapper.dll,但当我在C#项目中加载它时,函数M#u setCallback不在那里

我想知道是否有人能帮我一把,或者给我看一本教程,解释如何做到这一点(我发现的教程没有我必须使用的3个项目,我无法让它们工作)。我尝试过使用代理,但程序崩溃了

或者也许有一种更简单的方法

谢谢

下面是代码,非常简单:

首先,我有非托管dll: C++项目,Win32控制台应用程序,编译成DLL

defs.h

namespace JJLibrary
{
    typedef void (__stdcall *MYCALLBACK) (bool mybool, int myint);
}
非托管dll.h

#ifndef JJAPI_H
#define JJAPI_H

#ifdef UNMANAGED_EXPORTS
#define JJ_API __declspec(dllexport)
#else
#define JJ_API __declspec(dllimport)
#endif

#include "defs.h"

namespace JJLibrary
{
    JJ_API void U_helloWorld();
    JJ_API void U_setCallback( MYCALLBACK theCallback );
    JJ_API void U_runCallback();
}
#endif //JJAPI_H
非托管dll.cpp

#include "unmanaged_dll.h"
#include <iostream>
using namespace std;

namespace JJLibrary
{

    MYCALLBACK m_callback = 0;

    JJ_API void U_helloWorld()
    {
        cout << "Unmanaged: Hello world" << endl;
    }

    JJ_API void U_setCallback( MYCALLBACK theCallback )
    {
        cout << "Unmanaged: Setting callback" << endl;
        m_callback = theCallback;
    }

    JJ_API void U_runCallback()
    {
        bool b = true;
        int  i = 25;
        cout << "Unmanaged: Running callback: " << b << " " << i << endl;
        if (m_callback)
            m_callback(b, i);
        // In the final application b and i are generated here after processing data, I give them values for testing
        // When they are generated, call the function in C#
    }   

}

太多的代码让我无法真正理解,但我对类似问题的解决方案涉及一个如下所示的委托

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UserFunctionCallback(IntPtr context, int nvalues,
  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]IntPtr[] values);

<>如果有帮助,我可以添加更多代码。< /P>阅读完您的文章后,我认为标题应该是“代码”。运行一个非托管C++ DLL,从C++函数而不是<代码>运行一个非托管C++ DLL</代码>中的C函数。(因为我在寻找一种从非托管C++调用C语言函数的方法,看起来你用完全相反的方式来完成它(?)
#include "stdafx.h"
#include "wrapper.h"
#include "defs.h"
#include <iostream>
using namespace wrapper;
using namespace JJLibrary;
using namespace std;

void Wrapper::M_helloWorld()
{
    cout << "Managed: Hello World" << endl;
    U_helloWorld();
}

void Wrapper::M_setCallback( MYCALLBACK theCallback )
{
    cout << "Managed: Setting callback" << endl;
    U_setCallback( theCallback);
}

void Wrapper::M_runCallback(bool mybool, int myint)
{
    cout << "Managed: Running callback" << endl;
    U_runCallback(mybool, myint);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using wrapper;

namespace CS
{
    class Program
    {

        void Test(bool mybool, int myint)
        {
            Console.WriteLine(!mybool);
            Console.WriteLine(2*myint);
        }


        static void Main(string[] args)
        {
            Wrapper myWrapper = new Wrapper();
            myWrapper.M_helloWorld();
            myWrapper.M_setCallback(Test);
            myWrapper.M_runCallback(true, 25);  // --> false 50

            string s = Console.ReadLine();  // Pause
        }
    }
}
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UserFunctionCallback(IntPtr context, int nvalues,
  [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]IntPtr[] values);