题目
C#调用C++的dll总是报错 Attempted to read or write protected memory.Attempted to read or write p……
C#代码:
[DllImport("duxie.dll",EntryPoint = "lala",CharSet = CharSet.None)]
public static extern string lala();
private void button1_Click(object sender,RoutedEventArgs e)
{
string a = lala();//////////此处报错
}
错误为:Attempted to read or write protected memory.Attempted to read or write protected memory.
另外,dll本身的返回值是char*
我是新手,希望大家多多指教,最好详细一点,我会多加分的,
C#代码:
[DllImport("duxie.dll",EntryPoint = "lala",CharSet = CharSet.None)]
public static extern string lala();
private void button1_Click(object sender,RoutedEventArgs e)
{
string a = lala();//////////此处报错
}
错误为:Attempted to read or write protected memory.Attempted to read or write protected memory.
另外,dll本身的返回值是char*
我是新手,希望大家多多指教,最好详细一点,我会多加分的,
提问时间:2020-11-03
答案
建议动态库不要返回字符串指针.而是在参数中传递.
基本上没有见过动态库中返回字符串指针的.看看所有WIN32的API,应该是没有的
返回字符串是在C++中产生的,而C#的GC机制会试图销毁这个字符串
估计这时就出现你说的这个错误了
作为引参传递时,参数内存是以C#分配的,所以GC机制可以自动回收它的内存.
解释的可能不是很好,很简单,这个错误的意思应该 是:C#不能读写C++产生的内存.
当然,肯定有别的方法可以读写.不在本问题中了.
基本上没有见过动态库中返回字符串指针的.看看所有WIN32的API,应该是没有的
返回字符串是在C++中产生的,而C#的GC机制会试图销毁这个字符串
估计这时就出现你说的这个错误了
作为引参传递时,参数内存是以C#分配的,所以GC机制可以自动回收它的内存.
解释的可能不是很好,很简单,这个错误的意思应该 是:C#不能读写C++产生的内存.
当然,肯定有别的方法可以读写.不在本问题中了.
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
最新试题
- 1my father usually_____(take)a shower before he goes to bed
- 2今夫奕之为数的意思是什么
- 3take place of 与take he place of 用法区别.
- 4门上贴一张红纸是什么意思?
- 58月,某地发生了严重的洪涝灾害,工程队急修一条长8500米的公路,工作了5天,平均每天修300米,剩下的要在20
- 6put,teach的过去分词是什么呢(⊙o⊙)?
- 7设由正数组成的等比数列,公比q=2,且a1a2…a30=230,则a3a6a9…a30等于( ) A.210 B.215 C.216 D.220
- 8more outgoing的反义词是什么?
- 9Our Chinese teachers h_____ to help us with our reading.要求所填单词为4个字母.
- 101-1/2-1/2×1/3-1/3×1/4-.-1/10×1/11=?的简便算法
热门考点