参数中的数据值被复制到其他参数c ++,c#

时间:2012-06-04 13:35:09

标签: c# c++ visual-c++ c#-4.0

在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

并且给我一个错误,说空指针值被传递给函数。任何人都可以帮我解决这个奇怪的问题。

1 个答案:

答案 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