2

多くのタスクを実行する C++ dll に非常に大きな関数があります。ac# ラッパーから呼び出しており、c++ 関数が完了するまでに約 20 秒かかります。運営方法を変えたい。私の考えは、1.C++ 関数を async と呼び、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. C に似た名前を使用して C++ 関数をエクスポートします (export "C" __declspec(dllexport))。
  2. DllImport を使用してライブラリ呼び出し用の DllImport を作成します。
  3. スレッドを作成し、コールバック ロジック (つまり、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 に答える