C#调用C程序dll的内存问题 10C

项目需要:实现C#调用C语言写的的算法,该C程序需要封装成dll。C程序本身可以跑通没有任何问题,随即写了一个C#demo来调用该算法。报如下图的错误
图片说明
由于测试阶段,所以该C程序没有参数接口,所以排除网上一些帖子说的参数类型不匹配的原因。
进入dll内部进行调试,报如下错误
图片说明
经调试发现是第二块内存continental_47_grid分配失败导致的上图错误,第一块aodgrid分配正常。
图片说明
但如果手动把分配内存大小调小可以分配成功。如此看来是内存空间不够的问题导致的,但是C程序本身运行没有出现过这样的问题。难道是dll本事有内存限制机制?
卡了很多天了,还望各路大神帮忙看看
一下是C#调用代码:
public static class NativeMethod
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
public static extern int LoadLibrary(
[MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);

    [DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]
    public static extern IntPtr GetProcAddress(int hModule,
        [MarshalAs(UnmanagedType.LPStr)] string lpProcName);

    [DllImport("kernel32.dll", EntryPoint = "FreeLibrary")]
    public static extern bool FreeLibrary(int hModule);
}
       static int Main(string[] args)
    {
        int hModule = NativeMethod.LoadLibrary("AHI_AOD_noarg.dll");
        if (hModule == 0)
            return 1;
        IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "AHI");
        AHI AHI = (AHI)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(AHI));       
        AHI();
        return 0;
    }

}

}

0

5个回答

这个很难说,c程序本身比较简陋,像数组越界之类的,就是发生了,也不会报错。c能运行不等于程序没有问题。

2
oqqsail
一只大蘑菇 回复qq_36483972: 能详细点么朋友,我不太理解。接受函数返回是指调用函数的返回值还是什么?
一年多之前 回复
ZYF122122
ZYF122122 项目需要:实现C#调用C语言写的的算法,该C程序需要封装成dll。C程序本身可以跑通没有任何问题,随即写了一个C#demo来调用该算法。报如下图的错误
一年多之前 回复
qq_36483972
qq_36483972 先用c#的lntptr 接受函数返回,然后用Marshal.Copy() 复制到C#的数组里。如果你返回的数组的内容是c++程序分配的,那么需要提供一个C++函数来释放内存,否则就是内存泄露
一年多之前 回复

malloc 之后,你不做判断吗?
类似
float* value = malloc(sizeof(float)*10);
if(value==NULL)
{
int errno = getlasterror();
}

1

float* value = malloc(sizeof(float)*10);
if(value==NULL)
{
int errno = getlasterror();

0

你的size_band的值是多大?32位还是64位程序?小心不要超过系统允许的最大值

0
ddu_163
ddu_163 回复一只大蘑菇: Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,你的程序最大能用2G的内存左右。 你申请的内存36012001*4=137.37M,不到地址上限,但内存碎片也会影响一次能申请到的内存,C语言不做内存地址越界检查,只要不访问越界的内存,就不会报错。我不了解C#,不清楚C#是如何管理内存的,建议你改小size_band值试试,看看还报不报错,也可以把continetal_47_grid改为一个大的静态数组试试是不是内存申请出了问题。申请完内存,一定做检查。
一年多之前 回复
oqqsail
一只大蘑菇 C#和C程序都是32位的。size_band的值是 36012001,有最大值限制么,C程序本身是可以运行没问题的
一年多之前 回复

malloc 之后,你不做判断吗?
类似
float* value = malloc(sizeof(float)*10);
if(value==NULL)
{
int errno = getlasterror();
}

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!