首页 新闻 会员 周边

C#调用C++dll中方法,产生错误“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

0
[已解决问题] 解决于 2011-03-22 17:52

//Dll.h
#ifdef BLOOMFILTER_API
#else
#define BLOOMFILTER_API extern "C" _declspec(dllimport)
#endif

#include<string>
using namespace std;

BLOOMFILTER_API int RSHash(string str, int nLen);

//Dll.cpp
/
#include "stdafx.h"

#define BLOOMFILTER_API extern "C"__declspec(dllexport)
#include "VDDll.h"

int RSHash(string str, int nLen)  
{  
int b = 378551;  
int a = 63689;  
int hash = 0;  
for( int i = 0; i < nLen; i++) 
{  
hash = hash*a+str[i];  
a = a*b;  
}  
return (hash & 0x7FFFFFFF);  
}
//在C#中调用
 class testadd
 {
  [DllImport("VDDLL.dll", EntryPoint = @"RSHash", CharSet = CharSet.Ansi)]
  public static extern int RSHash(string str, int nLen);
  }
   
 static void Main(string[] args)
 {

  Console.WriteLine(testadd.RSHash("asd",3));

 }

问题补充: C++直接调用该DLL没有任何问题 testadd.RSHash("asd",3)是对的
niesen111的主页 niesen111 | 初学一级 | 园豆:0
提问于:2011-03-21 20:54
< >
分享
最佳答案
0

问题出在RSHash使用了stl对象,P/Invoke规范对这个调用形式没有民明确规定,估计会存在问题,最好使用Windows API的那些接口

C++调用可以是因为你用的都是VC的编译器,如果使用gcc的话也不行,srl这种结构的实现不同的语言和编译器还是有一定的差异的

2012 | 高人七级 |园豆:21230 | 2011-03-21 22:00
在RSHash使用了stl对象,哪里,求进一步解释。。。。。
niesen111 | 园豆:0 (初学一级) | 2011-03-22 11:22
string str 这个是stl的类,最好使用TCHAR* 这样的类型
2012 | 园豆:21230 (高人七级) | 2011-03-22 12:35
谢谢提示,问题已解决
......
niesen111 | 园豆:0 (初学一级) | 2011-03-22 17:52

@niesen111: 你好   我现在也出现了和你一样的问题  :

C# 调用C的Dll时,单独运行dll里的函数,结果没有问题;当C#调用C的dll时就会出现这个提示,尝试怎么修改都不行。有人的解决方法是将dll里函数需要返回的局部变量声明为static,但我的DLL函数返回值类型就是这样声明的。。。

 

[DllImport(@"message.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int sel_account_register(string name, string password, string profile);

调用代码:int i = SelInterface.sel_account_register(string.Empty, string.Empty, string.Empty);

 

请问你是怎么解决的问题?期待你的帮助!3Q

adaan | 园豆:193 (初学一级) | 2013-01-29 14:56

@niesen111: 你是怎么解决的   能提供一下思路吗?

我的函数返回值和参数类型和你是一样的呢。。

adaan | 园豆:193 (初学一级) | 2013-01-30 11:07
其他回答(1)
0

怎么解决的给大家分享一下啊

方小帅 | 园豆:200 (初学一级) | 2011-11-14 15:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册