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

Posted

技术标签:

【中文标题】将状态更新从 C++ 中的函数发送到 C#【英文标题】:send status updates from function in C++ to C# 【发布时间】:2012-10-19 08:02:17 【问题描述】:

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

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

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);

【问题讨论】:

【参考方案1】:

这是 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

【讨论】:

【参考方案2】:
    使用类似 C 的名称导出 C++ 函数(export "C" __declspec(dllexport)) 使用 DllImport 为您的库调用创建一个 DllImport。 创建一个线程并使用您的回调逻辑(即 Task.Run 与委托)调用导入。

【讨论】:

我认为你搞反了。 嗨。我正在执行您建议的前两个步骤。你能详细说明第三步吗?我知道如何在 c# 中使用线程。但我想显示从 C++ 发送的状态消息。我该怎么做?谢谢。【参考方案3】:

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

Dispatcher.BeginInvoke Method

【讨论】:

谢谢,您能详细说明一下吗?你建议我在我的 c# 包装器中使用委托。但是我在哪里使用invoke或begininvoke?我想将状态消息从我的 c++ 函数发送到 c# 包装器。那么如何从 C++ 发送它以及如何在 C# 中捕获消息?请理解我以前从未使用过 c++ 或事件委托。谢谢。

以上是关于将状态更新从 C++ 中的函数发送到 C#的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有值的函数发送到子组件 React?

如何将数据从 javascript 函数发送到 MIDI.js API 中的 MIDI.noteOn()

将 url 参数发送到通用视图,该视图将其发送到 ModelForm 中的元素

将字符串从 C# 发送到 C++

将数据从 C++ 发送到 C# [重复]

如何将实时更新发送到我的 Android 设备?