0

C ++では、これらの以下のクラスがあります

class A
{
  public: 
      int __thiscall check(char *x,char *y,char *z);
  private:
      B *temp;
};

class B
{
  friend class A;
  Public:
    B();
    B(string x,string y,string z);
    ~B();
  private:
    string x;
    string y;
    string z;
};

C ++での私のdllメソッドはこのようなものです

__declspec(dllexport) int __thiscall A::check(char *x,char *y,char *z)
{
  temp=new B(x,y,z);
  return 1;
}

B() コンストラクターのコードは以下のとおりです。

B::B(string x, string y,string z)
{
  .......
}

以下は私のc#dllインポートです

[DllImport("sour.dll", CallingConvention = CallingConvention.ThisCall, ExactSpelling = true, EntryPoint = "check")]
    public static extern void check(IntPtr val,string x,string y,string z);

C++ ビルドはエラーなしで成功しましたが、dll インポート メソッドを使用して C# からこのメソッドを呼び出すと、「temp」クラス ポインターにメモリを割り当てようとすると、以下のエラーが発生します。以下はエラーです。

 Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

誰でもこれについて助けてください。前もって感謝します。

4

2 に答える 2

2

クラスメンバーの代わりにメソッドをエクスポートする方が簡単だと思います。DllImport が正しい呼び出し規約を使用していることを確認してください。

__declspec(dllexport) void __cdecl check(int x)

PInvoke Interop Assistant を使用すると、

public partial class NativeMethods {

    /// Return Type: void
    ///x: int
    [System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="check", CallingConvention=System.Runtime.InteropServices.CallingConvention.Cdecl)]
public static extern  void check(int x) ;

}

dll の 32/64 ビット バージョンが一致していることを確認しましたか。x86 .net バージョン (32 ビット) を実行すると、ネイティブ コードとマネージ コードのデバッグを有効にでき、C++ メソッドにブレーク ポイントを設定して何が起こるかを確認できるはずです。

于 2012-06-01T18:22:12.540 に答える
1

PInvoke 経由で C++ を直接使用しても機能しません。C++ クラスは、まずヒープ上で new を介してインスタンス化する必要がありますが、管理されたコードからは実行できません。

呼び出すメンバー関数は、非静的メンバー メソッドであるため、DllImport ステートメントでthiscall 呼び出し規則を使用する必要があります。これには、スタック上のアンマネージド クラス インスタンスへのポインターを暗黙的に渡す必要がありますが、ここでは実際にはできません。

マネージドC++ ラッパー クラス(リンクを参照) を使用して直接アクセスすることを検討するか、ctor、dtor、およびインスタンス メンバーを、必要に応じて this ポインターを受け入れて返す直接 C メソッドとして呼び出すことができる C ラッパーを作成する必要があります。

非常にハックな解決策は、Marshal.GlobalAlloc を介して直接メモリを割り当て、PInvoke を介してこのストレージの場所で ctor を呼び出すことですが、必要なメモリ量を事前に把握していないため、これは汚いハックです。

于 2012-06-02T05:58:30.150 に答える