.NET 调用c++库注意事项
很久没有更新了,主要还是因为自己懒吧,希望从今天开始坚持至少一周写一篇文章。
调用函数库是正常的,调用完成后,在使用EF进行数据更新时,将发生如下异常信息,而且几乎必现。
行库遇到了错误。此错误的地址为 0x79e8eda2,在线程 0xaa4 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
有时可能会报“读或者写受访问的内存”。而如果在调用前后设置断点,将不会参数异常。
c++ 函数定义
BOOL WINAPI DataEncryption(const BYTE* pszData, \
const BYTE* pszDispersionFactor,\
BYTE** pcResult);
c#调用定义
bool DataEncryption(string encryptData,string dispFactor,ref string result);
如果使用以上定义,调用将发生上面错误,正确的定义应该是
bool DataEncryption(string encryptData,string dispFactor,ref StringBuilder result);
将string->StringBuilder即可解决这个问题。
这个问题个人觉得应该是是由于string在.NET中的特殊实现引起的。如果谁知道真正的原因,请帮忙解释一些原因