none
DLLないで定義された型をしようするには如何すればよいのでしょうか? RRS feed

  • 質問

  • C#初心者です。どなたかご教授お願い致します

    C++で作成したDLLをC#でインポートして使用するプログラムを作成しています。

    DLL内のメソッドを使用する際、DLL内で宣言された型をパラメータや戻り値で

    型や名前空間がみつから無いとエラーになってしまいます。

    使用できるようにするには如何すればよいのでしょうか。

    typedefで宣言された、型をインポートする方法があるのでしょうか。

     

    2010年8月11日 6:58

回答

  • ありません。C# で定義し直す必要があります。MSDN の「アンマネージ コードとの相互運用」以下をお読み下さい(結構な分量ですが)。

    // C++/CLI なら直接ヘッダファイルをインクルードすることもできます。

    • 回答の候補に設定 山本春海 2010年8月24日 8:29
    • 回答としてマーク 山本春海 2010年9月2日 6:52
    2010年8月11日 7:15
  • DllImportは使用せず、参照の追加でDllを指定し
    usingでクラスを追加しています。

    CLR プロジェクトで DLL を作っているのでしょうか?

    C++での宣言はdouble*です、コードは以下の通りです

    CLR プロジェクトであれば、double% などで受け取って、pin_ptr を使う手法が考えられます。
    http://ml.tietew.jp/cppll/csharpll/article/361
    http://msdn.microsoft.com/ja-jp/library/1dz8byfh.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月31日 7:11
    • 回答としてマーク 山本春海 2010年9月2日 6:52
    2010年8月11日 12:59
    モデレータ

すべての返信

  • ありません。C# で定義し直す必要があります。MSDN の「アンマネージ コードとの相互運用」以下をお読み下さい(結構な分量ですが)。

    // C++/CLI なら直接ヘッダファイルをインクルードすることもできます。

    • 回答の候補に設定 山本春海 2010年8月24日 8:29
    • 回答としてマーク 山本春海 2010年9月2日 6:52
    2010年8月11日 7:15
  • HongLiag様

    ありがとうございます。

    C#にて定義し使用できました。

    追加でもうしわけありませんが、質問があります。

    C++で作成したDLLのメソッドがポインタを使用する場合、どうすればよいのでしょうか。

    double*でパラメータを設定しなくていけないので、

    doublel a で宣言し、パラメータ設定時に ref a と設定したのですがエラーがでます。

    ポインタを使用するには、unsafeコンテキストのみで使用可能とでます。

    unsafeを調べたのですが、使用しないほうがよいなど多々見られました。

    unsafeを使わない方法をご存知であれば、ご教授お願いいたします。

     

    2010年8月11日 10:46
  • C++で作成したDLLのメソッドがポインタを使用する場合、どうすればよいのでしょうか。
    double*でパラメータを設定しなくていけないので、
    doublel a で宣言し、パラメータ設定時に ref a と設定したのですがエラーがでます。

    エラーや例外が出たのであれば、出たという事実だけでなく、どういったものが出たかを示すべきでしょう。(エラーメッセージなど)

    ちなみに、ref をつけたのは呼び出し側だけでなく、宣言にもですよね?

    [DllImport("hoge.dll")]
    private static extern void Test(ref double a);

    Test(ref b);

    ところで、その double のポインタは、配列の先頭アドレスではないですよね?


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年8月11日 11:07
    モデレータ
  • 回答ありがとうございます。

    エラーコードですが、ref double から double*に変換できません と出てしまいます。

    DllImportは使用せず、参照の追加でDllを指定し

    usingでクラスを追加しています。

    C++での宣言はdouble*です、コードは以下の通りです

    long ConvAb(long ViewID, long mode, double *lon, double *lat, cona utm1, EnumUTMDistUnitWrap DistUnit)
      {  
       cona * utm = new cona ();
       long ret =  instance->ConvLatLonToUTM( ViewID, mode, lon, lat, *utm, (EnumUTMDistUnit) DistUnit);
       utm1.m_iSize = utm->size();
       utm1.m_pszStr = (char *)utm->data();
       return ret;

      }

    unsafeを使用し出来たのですが、やはりこの方法しかないのでしょうか?

     

    2010年8月11日 12:39
  • DllImportは使用せず、参照の追加でDllを指定し
    usingでクラスを追加しています。

    CLR プロジェクトで DLL を作っているのでしょうか?

    C++での宣言はdouble*です、コードは以下の通りです

    CLR プロジェクトであれば、double% などで受け取って、pin_ptr を使う手法が考えられます。
    http://ml.tietew.jp/cppll/csharpll/article/361
    http://msdn.microsoft.com/ja-jp/library/1dz8byfh.aspx


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答の候補に設定 山本春海 2010年8月31日 7:11
    • 回答としてマーク 山本春海 2010年9月2日 6:52
    2010年8月11日 12:59
    モデレータ