2

ソースコードが利用できないサードパーティのプロプライエタリDLLを使用しています。ただし、SWIG1.3.39を使用して自動生成されたように見えるラッパーコードは利用できます。ラッパーコードは、(DLLを説明するいくつかのヘッダーを使用して)DLLにコンパイルするC ++ファイルと、C ++ラッパーDLLへのPInvoke呼び出しを行うC#プロジェクトで構成されます。

プロジェクトソリューションに含めたC++プロジェクトですが、C ++コードでブレークポイントを設定すると、そこに到達することはありません。C#でF11を実行しようとすると、C ++関数内に入ると、代わりに「アセンブリの表示」が表示されます。

[ソリューション]>[プロポーティ] >[構成プロポーティ]がありますが、アンマネージ/ネイティブコードをデバッグするオプションがあるものが見つかりません。

編集

ラッパーのC++コードを使用できます。また、C#から渡した値が実際にC#コードに渡されていることを確認する必要があります。

// In one file of the C# wrapper:
public string GetKey()
{
    // swigCPtr is a HandleRef to an object already created
    string ret = csWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);
    return ret;
}

// In the csWrapperPINVOKE class in another file in the C# wrapper:
[DllImport("csWrapper.dll", EntryPoint="CSharp_mdMUHybrid_GetKey")]
public static extern StringBuilder mdMUHybrid_GetKey(HandleRef jarg1);

そして、C++ラッパーからのC++コード。

SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
  char * jresult ;
  mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
  char *result = 0 ;

  arg1 = (mdMUHybrid *)jarg1; 
  result = (char *)(arg1)->GetKey();
  jresult = SWIG_csharp_string_callback((const char *)result); 
  return jresult;
}

今私はswigCPtr使用してC#ラッパーから渡そうとしているのでcsWrapperPINVOKE.mdMUHybrid_GetKey(swigCPtr);

ここで、jarg1がswigCPtrから値を取得しているかどうかを確認したいと思います。

SWIGEXPORT char * SWIGSTDCALL CSharp_mdMUHybrid_GetKey(void * jarg1) {
  char * jresult ;
  mdMUHybrid *arg1 = (mdMUHybrid *) 0 ;
  char *result = 0 ;

  arg1 = (mdMUHybrid *)jarg1; 
  result = (char *)(arg1)->GetKey();
  jresult = SWIG_csharp_string_callback((const char *)result); 
  return jresult;
}
4

1 に答える 1

0

マネージ exe があり、それが使用するネイティブ DLL をデバッグしたい場合は、そのことをデバッガに伝える必要があります。Debugger Type Autoを使用しないでください。これはデフォルトです。Mixed instaedを使用します。

auto はマネージド exe を識別し、マネージド デバッグを許可します。これは、ネイティブ C++ コードをデバッグするために必要なものではありません。

Debugger Type設定は、プロジェクト プロパティの[ Debugging ] セクションにあります。

于 2012-06-22T05:10:52.083 に答える