这个问题比较诡异,我在网上搜了很久都没找到答案,
C#调用DELPHI写的DLL,调用其中一个方法:
public static string 显示柜台返回信息()
{ StringBuilder pDataBack = new StringBuilder();
pDataBack.Capacity = 300000;
readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
string temp = pDataBack.ToString(); return temp;
}其中 readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
是调用delphi编写的DLL文件里的接口,其中 pDataBack 是在调用之后回写的参数,也就是说在DLL里会对该参数重新赋值,现在问题是,如果赋值的字符比较小,则正常通过,如果赋值的内容过多,则会报错,如下:
未处理的异常: System.AccessViolationException: 尝试读取或写入受保护的内存。这通
常指示其他内存已损坏。
在 SingleFunctionBetter.ReadAnswer.Invoke(Int32 ThreadNo, Int32 UniNumber, In
t32 dwCommObj, StringBuilder& pDataBack)
在 SingleFunctionBetter.Fixture.显示柜台返回信息() 位置 C:\guangda\test\Fixtu
re.cs:行号 111
在 SingleFunctionBetter.Fixture.Main(String[] args) 位置 C:\guangda\test\Fixt
ure.cs:行号 249
请按任意键继续. . .我把 ref 改成 out也不行,我给pDataBack设置容量 pDataBack.Capacity = 300000;也不行,返回字符肯定小于3万
实在没招了~,在此发帖给大家,希望帮我解决一下,感激不尽~!
C#调用DELPHI写的DLL,调用其中一个方法:
public static string 显示柜台返回信息()
{ StringBuilder pDataBack = new StringBuilder();
pDataBack.Capacity = 300000;
readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
string temp = pDataBack.ToString(); return temp;
}其中 readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
是调用delphi编写的DLL文件里的接口,其中 pDataBack 是在调用之后回写的参数,也就是说在DLL里会对该参数重新赋值,现在问题是,如果赋值的字符比较小,则正常通过,如果赋值的内容过多,则会报错,如下:
未处理的异常: System.AccessViolationException: 尝试读取或写入受保护的内存。这通
常指示其他内存已损坏。
在 SingleFunctionBetter.ReadAnswer.Invoke(Int32 ThreadNo, Int32 UniNumber, In
t32 dwCommObj, StringBuilder& pDataBack)
在 SingleFunctionBetter.Fixture.显示柜台返回信息() 位置 C:\guangda\test\Fixtu
re.cs:行号 111
在 SingleFunctionBetter.Fixture.Main(String[] args) 位置 C:\guangda\test\Fixt
ure.cs:行号 249
请按任意键继续. . .我把 ref 改成 out也不行,我给pDataBack设置容量 pDataBack.Capacity = 300000;也不行,返回字符肯定小于3万
实在没招了~,在此发帖给大家,希望帮我解决一下,感激不尽~!
DELPHI中函数的原型是:
函数原型:function ReadAnswer (ThreadNo: integer; UniNumber: integer; dwCommObj: DWORD; var pDataBack: pchar): boolean;stdcall; 这个DLL是别的公司写的,我不知道源代码,只有接口说明书
关键 C# 这边难道不该这样吗?
byte* pDataBack=stackalloc byte[3000];
可是这个需要回写噢~,回写用byte可以吗 ?还要加关键字 ref 噢
// 干脆改用这样试试
byte[] DataBack=new byte[30000];
fixed (byte* pDataBack=DataBack) {
readAnswer(ThreadNo, UniNumber, dwCommObj, ref pDataBack);
}// 另外,你这怎么写的?
[DllImport...]
static extern
bool readAnswer(int ThreadNo, int UniNumber, uint dwCommObj, ref byte pDataBack);
我这样写还是报同样的错误
悲剧了。。我用C++调用就没问题,
可以手动设置C#的栈大小吗?
有QQ吗,能否加你QQ请教下,或者加我Q:273040644
函数原型:function ReadAnswer (ThreadNo: integer; UniNumber: integer; dwCommObj: DWORD; var pDataBack: pchar): boolean;stdcall;
readAnswer(ThreadNo, UniNumber, dwCommObj, pDataBack);