在c ++中,我导出的方法是:
__declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z)
{
temp=new B(x,y,z);
}
在c#中,我将导入此方法:
[DllImport("IDLL.dll", CallingConvention=CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")]
public static extern int check(string x, string y, string z);
我在c#中调用此方法,并传递值:
public int temp()
{
string x="sdf";
string y="dfggh";
string z="vbnfg";
int t;
t=Class1.check(x,y,z);
return t;
}
问题在于,当我调试本机代码时,我看到参数x,y,z的值为sdf,dfggh,vbnfg,并且当它们进入c ++ dll之后甚至在它进入本机c ++之前被更改dll方法。
x=dfggh,y=vbnfg,z=null value
并且给我一个错误,说空指针值被传递给函数。任何人都可以帮我解决这个奇怪的问题。
答案 0 :(得分:1)
看起来您的本机方法是一个实例(vs static)方法。我想你的第一个参数会以某种方式映射到'this'。
以下是一个例子:
#include <fstream>
using namespace std;
class A
{
public:
__declspec(dllexport) static int __stdcall check(char *x,char *y,char *z)
{
ofstream f;
f.open("c:\\temp\\test.txt");
f<<x<<endl;
f<<y<<endl;
f<<z<<endl;
return 0;
}
__declspec(dllexport) int __thiscall checkInst(char *x,char *y,char *z)
{
ofstream f;
f.open("c:\\temp\\testInst.txt");
f<<x<<endl;
f<<y<<endl;
f<<z<<endl;
return 0;
}
};
在第一个上看静态关键字?
Imports(我使用了错误的名字,因为我很懒):
[DllImport("TestDLL.dll", CallingConvention = CallingConvention.StdCall, ExactSpelling = true, EntryPoint = "?check@A@@SGHPAD00@Z")]
public static extern int check(string x, string y, string z);
[DllImport("TestDLL.dll", CallingConvention = CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "?checkInst@A@@QAEHPAD00@Z")]
public static extern int checkInst(IntPtr theObject, string x, string y, string z);
这使得它就像那样:
check("x", "yy", "zzz");
实例方法需要IntPtr
IntPtr obj = IntPtr.Zero;
checkInst(obj, "1", "12", "123");
我的test.txt的内容是:
x
yy
zzz
和testInst.txt
1
12
123