2

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

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

例如: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);
4

3 回答 3

0
  1. Export your C++ function using a C-like name (export "C" __declspec(dllexport))
  2. Create a DllImport for your library call using DllImport.
  3. Create a thread and invoke the import with your callback logic (i.e. Task.Run with delegate).
于 2012-10-30T00:10:28.013 回答
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
}
于 2012-10-30T06:48:14.840 回答
0

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

Dispatcher.BeginInvoke 方法

于 2012-10-30T00:03:51.630 回答