从C ++中的函数发送状态更新到C#

时间:2012-10-29 23:40:14

标签: c# c++ events asynchronous delegates

我的C ++ dll中有一个非常大的函数,它执行很多任务。 我们从c#包装器调用它,并且c ++函数完成需要大约20秒。 我想改变我们运行它的方式。 我的想法是 1.调用c ++函数async和 2.每次完成具有C ++功能的任务时,我都希望将“task1 completed”消息发送给C#函数并将其显示给用户,以便他们知道后台发生了什么。

任何想法如何执行此操作?我查了几个例子,但感到困惑。我想知道是否有人这样做过。寻找一些指示。

EX:C ++代码

int  CppLibrary::ExecuteWorkflow( param1,param2, param3,param4,param5)
{
task1;
task2;
task3;
task4;
task5;

}

calling the C++ function from C# wrapper:

[DllImport(_dllLocation)]
public static extern int ExecuteWorkflow( param1,param2, param3,param4,param5);

3 个答案:

答案 0 :(得分:0)

您可以使用C#中的委托来调用C ++包装器,然后根据您的具体情况使用“invoke”或“beginInvoke”。

Dispatcher.BeginInvoke Method

答案 1 :(得分:0)

  1. 使用类似C的名称导出C ++函数(导出“C”__declspec(dllexport))
  2. 使用DllImport为您的库调用创建一个DllImport。
  3. 创建一个线程并使用您的回调逻辑调用导入(即Task.Run with delegate)。

答案 2 :(得分:0)

这是P / Invoke C ++函数的包装类。希望可以帮到你。

class CSUnmangedTestClass : IDisposable
{
    #region P/Invokes

    [DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", EntryPoint="#1")]
    private static extern IntPtr Foo_Create();

    [DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int Foo_Bar(IntPtr pFoo);

    [DllImport(@"E:\VS2012Tests\test\Debug\DllImport.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern void Foo_Delete(IntPtr pFoo);

    #endregion

    #region Members
    // variable to hold the C++ class's this pointer
    private IntPtr m_pNativeObject;
    #endregion

    public CSUnmangedTestClass()
    {
        this.m_pNativeObject = Foo_Create();
    }

    public void Dispose()
    {
        Dispose(true);
    }

    protected virtual void Dispose(bool bDisposing)
    {
        if (this.m_pNativeObject != IntPtr.Zero)
        {
            Foo_Delete(m_pNativeObject);
            this.m_pNativeObject = IntPtr.Zero;
        }
        if (bDisposing)
        {
            // No need to call the finalizer since we've now cleaned up the unmanged memory
            GC.SuppressFinalize(this);
        }
    }

    ~CSUnmangedTestClass()
    {
        Dispose(false);
    }

    #region Wrapper methods

    public int Bar()
    {
        return Foo_Bar(m_pNativeObject);
    }

    #endregion
}