我正在开发一个C#应用程序,并在这里遇到一个奇怪的问题。我有一个用C ++构建的.dll,我必须从C#app中调用这个.dll中的一些函数。
请考虑以下示例代码:
public partial class MainWindows: Window
{
public MainWindow()
{
InitializeComponent();
ConfigurationFunctions.StartMain(); //Start main is the DLL function in C++
int x = ConfigurationFunctions.ReturnIntExp();
StringBuilder sb = ConfigurationOptions.ReturnSomethingExp();
}
}
C ++ .cpp文件
EXPORT_API int xExp;
EXPORT_API char cExp;
EXPORT_API StartMain()
{
//Calculate `x` and `y` in this program values here and allocate to variables to be returned from function
xExp = x;
cExp = c;
}
EXPORT_API int ReturnIntExp()
{
return xExp;
}
EXPORT_API char ReturnSomethingExp()
{
return cExp;
}
问题是当我从.dll运行StartMain()
函数时,它计算了int
和char
的一些值,这些值必须分配给变量(实际返回)到C#应用程序)
但是,在StartMain()
之后,C#应用程序应该等到StartMain()
函数完成(在这种情况下大约需要3-4秒,而dll本身会触发两个/三个其他进程)只有这样才能继续进行,否则C#应用程序中的变量x
和sb
将具有空/无意义的值。
在这种情况下如何实现同样的目标?
答案 0 :(得分:2)
添加第三个导出变量ReturnIsReady()
,如果其他两个方法包含有意义的数据,则返回true
,否则返回false
。然后只需要一个带睡眠的循环来检查该值,直到它发生变化。
更好的选择是实现互斥或类似的结构,但是旋转等待应该足以在启动时对该长度进行单次等待。
或者,为什么在填写值之前StartMain()
会返回?