отправлять обновления статуса из функции в C ++ в C #

У меня есть очень большая функция в моей C ++ DLL, которая выполняет много задач.
мы вызываем его из оболочки c #, и для завершения функции c ++ требуется около 20 секунд.
Я хочу изменить способ, которым мы его управляем.
моя идея
1. вызвать функцию c ++ асинхронно и
2. каждый раз, когда задача с функцией C ++ завершается, я хочу отправить сообщение «task1 complete» в функцию 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);

2

Решение

Вы можете использовать делегаты в C # для вызова оболочки C ++, а затем использовать «invoke» или «beginInvoke» в зависимости от вашей ситуации.

Метод Dispatcher.BeginInvoke

0

Другие решения

  1. Экспортируйте свою функцию C ++, используя C-подобное имя (export «C» __declspec (dllexport))
  2. Создайте DllImport для вашего библиотечного вызова, используя DllImport.
  3. Создайте поток и вызовите импорт с помощью логики обратного вызова (т. Е. Task.Run с делегатом).
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
}
0
По вопросам рекламы [email protected]