//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));
}
问题出在RSHash使用了stl对象,P/Invoke规范对这个调用形式没有民明确规定,估计会存在问题,最好使用Windows API的那些接口
C++调用可以是因为你用的都是VC的编译器,如果使用gcc的话也不行,srl这种结构的实现不同的语言和编译器还是有一定的差异的
@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
@niesen111: 你是怎么解决的 能提供一下思路吗?
我的函数返回值和参数类型和你是一样的呢。。
怎么解决的给大家分享一下啊