我非常困难,并且已经搜索了很长一段时间。 我从c#调用c ++ DLL 我可以在一个简单的控制台应用程序中完成所有工作,但相同的代码在WebApp中不起作用
我使用的是Windows 10 64位但是我强迫一切都使用32位并且调用是Cdecl
c#code:
namespace WebApp
{
public class LibWrap
{
[DllImport("mdll.dll", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
public static extern Int32 MySize(Int64 start,
Int32 count,
Int64[] from,
Int64[] to,
Int32[] ids,
ref Int32 id_cnt);
}
public partial class Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
Int64 l_start = 1431644400;
Int64[] l_from = {
1431644400,
1432114200,
1432162800,
1432278000,
1432335600
};
Int64[] l_to = {
1431673200,
1432119600,
1432200600,
1432288800,
1432364400
};
Int32[] l_IDs = {
1,
1,
1,
1,
1
};
int l_idCnt = 0;
Int32 l_Count = LibWrap.MySize(l_start, l_from.Length, l_from, l_to, l_IDs, ref l_idCnt);
}
}
}
调用的DLL头代码是:
#define DEF_EXPORT __declspec(dllexport) __cdecl
int32_t DEF_EXPORT MySize(int64_t start,
int32_t count,
int64_t * from,
int64_t * to,
int32_t * ids,
int32_t & id_cnt);
c ++来源:
int32_t DEF_EXPORT MySize(int64_t start,
int32_t count,
int64_t * from,
int64_t * to,
int32_t * ids,
int32_t & id_cnt)
{
MyCore mycore;
int32_t sz = 0;
if (count)
{
mycore.Count = count;
mycore.Ids = ids;
mycore.From = from;
mycore.To = to;
mycore.Start = start;
IDList id_positions[MY_LIMIT];
id_cnt = 1;
sz = mycore.OutputSize(id_positions, id_cnt);
}
return sz;
}
正如我所说,当试图呼叫System.StackOverflowException
时,WebApp会抛出MySize
错误。
一进入System.StackOverflowException
函数(即在第一行运行之前),就使用本地代码调试MySize
感谢任何见解,我在网上找到的每个解决方案似乎已经涵盖在我的案例中。
答案 0 :(得分:0)
好的,这是控制台应用程序与webapps提供的堆栈内存问题 在32位以下,网络应用程序只能获得256Kb。
罪魁祸首是阵列:
IDList id_positions[MY_LIMIT];
将其移至动态分配会使其脱离堆栈并解决问题。