为什么在C#中实现为DLL时的C代码比较慢

时间:2018-10-31 22:27:02

标签: c# c sqlite

我做了一个C程序,该程序从二进制文件中读取一些值并将其写入SQLite DB中。我在DLL库中转换了相同的文件,然后从C#的Windows Form App中调用了它。以下是一个说明我要做什么的示例:

在C#中,我使用以下内容

[DllImport("Progress.dll", EntryPoint = "CreateDB", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern int avance(IntPtr Path);

DLL C代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h >
#include <math.h>
#define EXPORT __declspec(dllexport)
EXPORT void CreateDB(int f)
{
for (int i=0;i<4;i++)
{
    sleep(1);
    f=i+1;
}
}

变量 f 返回我要在进度栏中使用的值。

Exe C代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
#include <math.h>
int main()
{
    for (int i=0;i<4;i++)
    {
        sleep(1);
    }
}

现在,我将C程序作为DLL调用,它持续执行了三次。我希望时间与C exe文件非常相似。此外,进度条不会实时更新。

Windows应用程序窗体中的C#代码如下:

private void button7_Click(object sender, EventArgs e)
    {
        progressBar1.Maximum = 4;
        IntPtr strPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)));
        progressBar1.Value = avance(strPtr);
        Application.DoEvents();
    }

当进入C DLL的循环正在运行时,如何解决速度问题以及如何更新进度栏?

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您的C#代码调用C函数,就好像它使用了指向int的指针一样。但是根据您的声明,它需要一个简单的int。如果您进行如下更改,它应该可以工作:

EXPORT void CreateDB(int *f)
{
    for (int i = 0; i < 4; i++)
    {
        sleep(1);
        *f = i + 1;
    }
}