C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: 言語の違う演算子って呼べるの?


(過去ログ 114 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■67565 / inTopicNo.1)  言語の違う演算子って呼べるの?
  
□投稿者/ mct (1回)-(2013/08/09(Fri) 20:25:30)

分類:[.NET 全般] 

C#でC++で記述されたopretor演算子を使うにはどうすればいいですか?

C#でC++/CLIで記述されたopretor演算子を使うにはどうすればいいですか?
できないんですかね?
できないなら、同じ処理をC#で記述するしかないですか?
C++/CLIはDLL化になってます。

[C#]
class Cs{
static void Main(string[] args){
Cpp a = new Cpp();
Cpp b = new Cpp();
中略
if(a==b){ <-c++/cliのクラスCppのoperator==へ行かない.aとbの参照の比較になってしまう
以下略



[C++/CLI]
class Cpp{

途中省略

bool Cpp::operator ==(Cpp^ c)
{ return 処理のため省略; }

bool Cpp::operator !=(Cpp^ c)
{ return !処理のため省略;}
など

引用返信 編集キー/
■67569 / inTopicNo.2)  Re[1]: 言語の違う演算子って呼べるの?
□投稿者/ 774RR (99回)-(2013/08/10(Sat) 06:01:40)
直接呼び出せるかどうかは未検証だけど、提示コードをぱっと見た範囲では
・ C++/CLI 側のコードは unmanage リソースを使っている
・ C# 側のコードは manage リソース専用 (unmanage を直接使う配慮をしていない)
なので、仮に演算子関数が呼べたとしても使い道がない様子。

引用返信 編集キー/
■67573 / inTopicNo.3)  Re[2]: 言語の違う演算子って呼べるの?
□投稿者/ mct (3回)-(2013/08/10(Sat) 09:42:49)
No67569 (774RR さん) に返信
> 直接呼び出せるかどうかは未検証だけど、提示コードをぱっと見た範囲では
> ・ C++/CLI 側のコードは unmanage リソースを使っている
> ・ C# 側のコードは manage リソース専用 (unmanage を直接使う配慮をしていない)
> なので、仮に演算子関数が呼べたとしても使い道がない様子。
>

・ C# 側のコードは manage リソース専用 (unmanage を直接使う配慮をしていない)
とはどういうことでしょうか?どのように配慮するのでしょうか?

・ 仮に演算子関数が呼べたとしても使い道がない様子。
なぜ使い道がないのかわからない?

どのようにすればよいのでしょうか?
引用返信 編集キー/
■67574 / inTopicNo.4)  Re[3]: 言語の違う演算子って呼べるの?
□投稿者/ Azulean (190回)-(2013/08/10(Sat) 09:50:23)
C# からネイティブの C++ のクラスを呼ぶ方法は基本的にありませんので、C++/CLI を使ってマネージクラスを作る必要があります。
しかし、あなたが提示したサンプルコードは ref class (マネージクラス)になっていません。
このため、コンパイルエラー(Cpp というクラスを C# から見つけることができない)になるはずなので、operator がどうのこうのというレベルではないということでは?

おそらく質問するときの書き下ろしで、端折りすぎたのではないかとは思いますが…。
引用返信 編集キー/
■67575 / inTopicNo.5)  Re[4]: 言語の違う演算子って呼べるの?
□投稿者/ Hongliang (80回)-(2013/08/10(Sat) 10:03:20)
operatorの記述は^使ってるんでref classじゃないのは省略しすぎたってことでしょうか。
C#から呼べないのは、演算子オーバーロードの記述がstaticじゃないからじゃないかなーと踏んだのですが。
引用返信 編集キー/
■67576 / inTopicNo.6)  Re[4]: 言語の違う演算子って呼べるの?
□投稿者/ Azulean (191回)-(2013/08/10(Sat) 10:03:34)
2013/08/10(Sat) 10:03:50 編集(投稿者)
さて、static の 2 引数採る operator を書かないといけないと思います。

// C++/CLI
namespace ClassLib {

	public ref class TestClass
	{
	public:
		TestClass() { }

		property int a;
		property int b;
		property int c;

		static bool operator ==(TestClass^ left, TestClass^ right)
		{
			if (Object::ReferenceEquals(left, right)) return true;
			if (Object::ReferenceEquals(left, nullptr)) return false;
			if (Object::ReferenceEquals(right, nullptr)) return false;
			return (left->a == right->a && left->b == right->b && left->c == right->c);
		}
	};
}

// C# 
static void Main(string[] args)
{
    TestClass c1 = new TestClass { a = 1, b = 2, c = 3};
    TestClass c2 = new TestClass { a = 1, b = 2, c = 3};
    Console.WriteLine("c1 == c2? {0}", c1 == c2);
}

// 出力結果
c1 == c2? True

引用返信 編集キー/
■67578 / inTopicNo.7)  Re[5]: 言語の違う演算子って呼べるの?
□投稿者/ mct (4回)-(2013/08/10(Sat) 10:55:43)
No67575 (Hongliang さん) に返信
> operatorの記述は^使ってるんでref classじゃないのは省略しすぎたってことでしょうか。
> C#から呼べないのは、演算子オーバーロードの記述がstaticじゃないからじゃないかなーと踏んだのですが。

ref class省略するのはやりすぎましたね。すみません。

Azulean さんのソースで新たにソリューションを作るとちゃんと動くのですが
自身のほうに構成するとなぜか演算子が呼ばれず参照になっちゃいます
原因がわからないです。

引用返信 編集キー/
■67579 / inTopicNo.8)  Re[6]: 言語の違う演算子って呼べるの?
□投稿者/ Azulean (192回)-(2013/08/10(Sat) 11:09:55)
No67578 (mct さん) に返信
> Azulean さんのソースで新たにソリューションを作るとちゃんと動くのですが
> 自身のほうに構成するとなぜか演算子が呼ばれず参照になっちゃいます
> 原因がわからないです。

よくあるパターンとしては、C# のプロジェクトで参照している C++/CLI の DLL が古いケースです。
C# のプロジェクトでの参照設定から一度 C++/CLI の DLL を消して、同じソリューション内ならプロジェクト参照(参照の追加ダイアログのプロジェクトタブから)、違うソリューションなら最新の DLL が置いてあるところから参照するようにしてみてください。

それでもダメとなると、ソリューション構成の特徴や実際に再現するソースコードを提示してもらえないと難しいかもしれません。
引用返信 編集キー/
■67580 / inTopicNo.9)  Re[7]: 言語の違う演算子って呼べるの?
□投稿者/ mct (5回)-(2013/08/10(Sat) 11:18:56)
2013/08/10(Sat) 11:28:21 編集(投稿者)

No67579 (Azulean さん) に返信
> ■No67578 (mct さん) に返信
>>Azulean さんのソースで新たにソリューションを作るとちゃんと動くのですが
>>自身のほうに構成するとなぜか演算子が呼ばれず参照になっちゃいます
>>原因がわからないです。
>
> よくあるパターンとしては、C# のプロジェクトで参照している C++/CLI の DLL が古いケースです。
> C# のプロジェクトでの参照設定から一度 C++/CLI の DLL を消して、同じソリューション内ならプロジェクト参照(参照の追加ダイアログのプロジェクトタブから)、違うソリューションなら最新の DLL が置いてあるところから参照するようにしてみてください。
>
> それでもダメとなると、ソリューション構成の特徴や実際に再現するソースコードを提示してもらえないと難しいかもしれません。

DLLを読み直すといけました。
原因は
Debugで実行してましたが
ReleaseでビルドしたDLLを読んでました。
お騒がせしました。
無事解決いたしました。

ご協力くださりありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -