- - PR -
C#とC++のDLL(どちらもManaged)間で文字列をやりとりする方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-03-24 14:02
毎度お世話になっております。
前日から、VC6.0で作ったC++のUnmanaged DLLのクラスをC#から利用する方法について調べております。 今の状況としては、Unmanaged DLLをManaged DLL(どちらもC++)でラップして、それをC#から利用しようとしています。 ここで、C++ Managed DLLにC#から文字列を渡す方法がわからず困っています。 具体的にはLPCTSTR,LPTSTRなどのC++インターフェースをC#で使いたいのですが、sbyte*に変換できませんというコンパイルエラーがでてしまいます。 少々ややこしい話で申し訳ありませんが、何か知っている方がおりましたらご一報をお願いします。 | ||||
|
投稿日時: 2005-03-24 14:31
Managed C++ で書いたラッパクラスのラップ度?が低すぎます。 .NET ランタイム内部では、文字列は System.String クラスなので、Managed C++ なら派クラスで文字列を受け取る時は System.String クラスを受け取るようにしましょう。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||
|
投稿日時: 2005-03-24 14:37
渋木宏明(ひどり)様、ご返事ありがとうございます。
引用: .NET ランタイム内部では、文字列は System.String クラスなので、Managed C++ なら派クラスで文字列を受け取る時は System.String クラスを受け取るようにしましょう。 とのことでしたが、今そのインターフェースに書き換えてもやはり、C#のコンパイルエラー(sbyte *に変換できない)になってしまいます。 コードのイメージは下のようなかんじです。 C# System.String str = new System.String('a', 10); obj.func(str); //コンパイルエラー C++ Managed DLL class a{ func(System::String* str); } | ||||
|
投稿日時: 2005-03-24 15:36
お疲れ様です。
なぜかしらないけど、C++ Managed DLL(ラッパー)の参照設定を一度削除し、またプロジェクトで追加したらsbyte*ではなくstringになって、無事にC#から使えるようになりました。 おそらく、ラッパーの外部インターフェースの更新が行われなかったため、最初に書いていたLPCTSTRのままになってC#のコンパイルが通らなかったのだと思います。 以上、よくわかりませんが、私の3時間はこれでつぶされました。 ありがとうございました。 | ||||
|
投稿日時: 2005-03-24 17:41
おそらく、Managed C++ のクラスライブラリを「プロジェクト参照」しないで、.DLL を直接参照設定したからでしょう。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://www.hidori.jp/ // Microsoft MVP for Visual C# [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2005-03-24 18:25 ] |
1