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

并给我一个错误,说空指针值被传递给函数。谁能帮我解决这个奇怪的问题。

4

1 回答 1

1

看起来您的本机方法是一个实例(与静态)方法。我猜你的第一个参数会以某种方式映射到“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;

    }
};

看到第一个的静态关键字了吗?

进口(因为我很懒,我使用了错误的名称):

[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
于 2012-06-04T14:43:42.620 回答