- PR -

C#とC++のDLL(どちらもManaged)間で文字列をやりとりする方法

1
投稿者投稿内容
ほんちん
会議室デビュー日: 2005/03/18
投稿数: 14
投稿日時: 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*に変換できませんというコンパイルエラーがでてしまいます。

少々ややこしい話で申し訳ありませんが、何か知っている方がおりましたらご一報をお願いします。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-03-24 14:31
引用:

具体的にはLPCTSTR,LPTSTRなどのC++インターフェースをC#で使いたいのですが、sbyte*に変換できませんというコンパイルエラーがでてしまいます。



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/18
投稿数: 14
投稿日時: 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/18
投稿数: 14
投稿日時: 2005-03-24 15:36
お疲れ様です。
なぜかしらないけど、C++ Managed DLL(ラッパー)の参照設定を一度削除し、またプロジェクトで追加したらsbyte*ではなくstringになって、無事にC#から使えるようになりました。

おそらく、ラッパーの外部インターフェースの更新が行われなかったため、最初に書いていたLPCTSTRのままになってC#のコンパイルが通らなかったのだと思います。

以上、よくわかりませんが、私の3時間はこれでつぶされました。
ありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-03-24 17:41
引用:

おそらく、ラッパーの外部インターフェースの更新が行われなかったため、最初に書いていたLPCTSTRのままになってC#のコンパイルが通らなかったのだと思います。



おそらく、Managed C++ のクラスライブラリを「プロジェクト参照」しないで、.DLL を直接参照設定したからでしょう。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://www.hidori.jp/
// Microsoft MVP for Visual C#

[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2005-03-24 18:25 ]
1

スキルアップ/キャリアアップ(JOB@IT)