江湖救急,用c++/cli调c++ dll时,出现AccessViolationException

soilwork 2009-06-08 09:07:59
c++中的原函数是:
TootleResult TOOTLE_DLL TootleOptimizeVCache( const unsigned int* pnIB, unsigned int nFaces, unsigned int nVertices, unsigned int nCacheSize, unsigned int* pnIBOut, unsigned int* pnFaceRemapOut,TootleVCacheOptimizer eVCacheOptimizer);

我用cli写的wrapper:
static TootleResult OptimizeVCache(array<int>^ input,unsigned int faceCount,unsigned int vertexCount, unsigned int cacheSize,array<int>^ output,TootleVCacheOptimizer optimizeFlag)
{
pin_ptr<int> ppInput = &input[0];
pin_ptr<int> ppOutput = &output[0];
unsigned int* pInput= (unsigned int*)ppInput;
unsigned int* pOutput = (unsigned int*)ppOutput;

return TootleOptimizeVCache(pInput,faceCount,vertexCount,cacheSize,pOutput,nullptr,optimizeFlag); //这里抛出异常
}


这个函数的作用是输入一组int值,通过特定算法排序之后输出
现在的问题是当输入数组长度超过3千万左右时,就会抛出AccessViolationException异常,其他情况下一切正常。弄了一下午,实在无解,请熟悉互操作高手指点....
...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
soilwork 2009-06-10
  • 打赏
  • 举报
回复
没人遇到过类似的问题吗?
soilwork 2009-06-09
  • 打赏
  • 举报
回复
晕 就是没有c++的源码才来问的啊,要不我自己就搞定了
li45214521 2009-06-09
  • 打赏
  • 举报
回复
你要把C++ 实现贴出来,才能进一步看看是不是 封送问题
soilwork 2009-06-09
  • 打赏
  • 举报
回复
up
soilwork 2009-06-08
  • 打赏
  • 举报
回复
不太像是c++库的问题
我又试了一下,如果直接在vs里F5启动,当数组大小超过1800*1800左右的时候就会出现异常
如果ctrl+F5,则要到2200*2200左右才会出现异常

是不是.net互操作时对数据大小有限制?
cnzdgs 2009-06-08
  • 打赏
  • 举报
回复
如果只有数组长度超过3千万时才出错,基本上可以认定是c++函数的问题。
soilwork 2009-06-08
  • 打赏
  • 举报
回复
TootleOptimizeVCache内部定义了OutOfMemory异常,如果出错,会作为错误代码返回
现在得到的是.net异常,我怀疑是封送的时候出现的错误,不过不太确定
li45214521 2009-06-08
  • 打赏
  • 举报
回复
你应该看看这个函数实现是否有限制 TootleOptimizeVCache

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧