调用来自C ++ DLL一个C#方法/功能(这是从C#满载" dllimport的") [英] Call a C# method/function from a C++ DLL (which is loaded from C# with "Dllimport")

查看:188
本文介绍了调用来自C ++ DLL一个C#方法/功能(这是从C#满载" dllimport的")的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个有点难以恢复它在一个单一的标题,所以在这里我的情况。

It's a little hard to resume it in a single title, so here my situation.

我要建加载一个C ++库C#应用程序。

我称之为从C函数++ DLL。结果
,而我也希望我的C ++ DLL调用从C#应用程序功能(即进口/运行它)...

I'm building a C# application that loads a C++ library.
I call functions from that C++ DLL.
But I'd also like my C++ DLL to call functions from the C# application (that is importing/running it)...

下面一段代码,使其多了几分全面的:

Here a piece of code to make it a little more comprehensive :

// I'm importing functions from my native code
[DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
public static extern int returnIntValue(int value);
[DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
public static extern int returnIntArrValueAt(int[] values, int index);

// Here is the kind of code it should be
// [DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)] 
// public static extern void callCSharpFunction( FunctionPointer fctPointer );

main    
{
    // I run the function
    int intValue1 = 
        MyAddIn.returnIntValue(147852369);
    int intValue2 = 
        MyAddIn.returnIntArrValueAt( new int[] { 9, 4, 3, 2, 1, 0 }, 5);

    // Here is an example function I use to call my C# func from C++
    // MyAddIn.returnIntValue( &myCSharpFunction );
}

// This is the method I'd like to call from my C++ imported library
static public void myCSharpFunction()
{
    MessageBox.Show("Called from C++ code !!");
}



因此​​,要恢复:

So, to resume :


  • C#代码导入我的C ++ DLL

  • C#运行从C ++ DLL函数

  • C ++ DLL方法调用它显示一个消息框C#方法(即)

推荐答案

这样就OK了,经过一些测试上开始回零,我终于得到这个回调运行!

So ok, after a few test on starting back to zero, I finally managed to get this callback running !

因此,这里的测试项目,我创建使用回调。

So here is the test project I created to use the callback.

LIBRARY TestCallBack
    EXPORTS
        callCSharpFunction



TestCallBack.cpp



TestCallBack.cpp

__declspec(dllexport) void callCSharpFunction ( void *fctPointer(int) )
{
    fctPointer(123456);
}

本C ++项目正在兴建一个DLL文件,并把内LIB项目中的C#的项目文件夹。

This C++ project is being built as a "DLL" file and put within a "lib" project in the C#'s project folder.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        // Set the library path
        const string dllFilePath = 
        "C:\\PathToProject\\TestCallBack\\ConsoleApp\\lib\\TestCallBack.dll";

        // This is the delegate type that we use to marshal
        // a function pointer for C to use. You usually need
        // to specify the calling convention so it matches the
        // convention of your C library. The signature of this
        // delegate must match the signature of the C function
        // pointer we want to use.
        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        delegate void FunctionPointer( int nb);

        // This is the function we import from the C library.
        //[DllImport(dllFilePath)]
        [DllImport(dllFilePath, CallingConvention = CallingConvention.Cdecl)]
        public static extern void callCSharpFunction(IntPtr fctPointer);

        // This is the placeholder for the function pointer
        // we create using Marshal.GetFunctionPointerForDelegate
        static IntPtr FctPtr;

        // This is the instance of the delegate to which our function
        // pointer will point.
        FunctionPointer MyFunctionPointer;

        // This calls the specified delegate using the C library.
        void CallFunctionPointer(FunctionPointer cb)
        {
            // make sure the delegate isn't null
            if (null == cb) throw new ArgumentNullException("cb");

            // set our delegate place holder equal to the specified delegate
            MyFunctionPointer = cb;

            // Get a pointer to the delegate that can be passed to the C lib
            FctPtr = Marshal.GetFunctionPointerForDelegate(MyFunctionPointer);

            // call the imported function with that function pointer.
            callCSharpFunction(FctPtr);
        } 

        static void Main(string[] args)
        {
            // This is the instance of the delegate to which our function
            // pointer will point.
            FunctionPointer printInConsoleDelegate;

            // Create the delegate object "MyFunctionPointer" that references 
            printInConsoleDelegate = new FunctionPointer(printInConsole);

            // Get a pointer to the delegate that can be passed to the C lib
            IntPtr printInConsolePtr = 
                Marshal.GetFunctionPointerForDelegate(printInConsoleDelegate);

            Console.WriteLine(
                "Call C++ which's calling back C# func \"printInConsole\"");

            // Call C++ which calls C#
            callCSharpFunction(printInConsolePtr);

            // Stop the console until user's pressing Enter
            Console.ReadLine();
        }

        public static void printInConsole(int nb) 
        {
            // Write the parameter in the console
            Console.WriteLine("value = " + nb + "; ");
        }
    }
}

这篇关于调用来自C ++ DLL一个C#方法/功能(这是从C#满载" dllimport的")的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆