WebApp中的Dllimport System.StackOverflowException控制台工作正常

时间:2016-03-15 03:41:59

标签: c# c++ .net dll dllimport

我非常困难,并且已经搜索了很长一段时间。 我从c#调用c ++ DLL 我可以在一个简单的控制台应用程序中完成所有工作,但相同的代码在WebApp中不起作用

我使用的是Windows 10 64位但是我强迫一切都使用32位并且调用是Cdecl

c#c​​ode:

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 感谢任何见解,我在网上找到的每个解决方案似乎已经涵盖在我的案例中。

1 个答案:

答案 0 :(得分:0)

好的,这是控制台应用程序与webapps提供的堆栈内存问题 在32位以下,网络应用程序只能获得256Kb。

罪魁祸首是阵列:

IDList id_positions[MY_LIMIT];

将其移至动态分配会使其脱离堆栈并解决问题。