我的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);
答案 0 :(得分:0)
您可以使用C#中的委托来调用C ++包装器,然后根据您的具体情况使用“invoke”或“beginInvoke”。
答案 1 :(得分:0)
答案 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
}