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

そして、nullポインタ値が関数に渡されたというエラーが表示されます。誰かがこの奇妙な問題を解決するのを手伝ってくれますか?

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;

    }
};

最初のstaticキーワードを参照してください。

インポート(私は怠け者なので、マングルされた名前を使用しました):

[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 に答える