- PR -

Enum のキャストがC++とC#の間で出来ない

1
投稿者投稿内容
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2005-04-12 11:21
ライブラリコードを書いています。クライアントコードで Enum を定義してもらい、そのメンバを引数にとるメソッドを定義しようとしています。すべてC#の場合、以下のコードで動作します。
---ライブラリ側---
Class CSharpClass{
public void LibMethod(System.Enum e)
{...}
}

---クライアント側---
System.Enum MyEnumType
{enum1, enum2, enum3}
----
// メソッド呼び出し(C#)
LibMethod(MyEnumType.enum1);
------------------------------------

しかし、クライエント側のManaged C++ から呼び出すと、MyEnumType から System.Enum にキャスト出来ないとコンパイルエラーが出てしまいます。
// メソッド呼び出し(C++)
LibMethod(MyEnumType::enum1);

いろいろ試した結果、クライアント側のC#コードにヘルパメソッド(というのでしょうか?この場合)を追加して、C++からこれを呼ぶようにすれば、動作することが分かりました。
public void LibMethodCastHelp(MyEnumType e)
{
CSharpClass.LibMethod(e);
}

しかし、ライブラリで追加出来るならともかく、クライアントにそういう作業をしてもらうのは出来れば避けたいと思っています。なにかもっと美しい方法はないでしょうか?

どうぞよろしくお願いします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-04-12 11:52
列挙型はManaged C++で定義されているのですか?
そうであるならば、その列挙型に__value キーワードは付加されているのでしょうか?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vcmxspec/html/vcManagedExtensionsSpec_12.asp
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2005-04-13 01:03
列挙型はC#で定義されています。
よろしくお願いします。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-04-13 08:17
System.Enumは参照型ですよ。なのでC++では

コード:

LibMethod(System::Enum* value);



になるはず。

コード:

LibMethod(__box(MyEnumType::enum1));



これで通りませんか(未確認)。
ただ正直これでいいのか不明…生成されたILを眺めてみないことには判断しにくい…。
がりうむ
会議室デビュー日: 2004/11/16
投稿数: 19
投稿日時: 2005-04-28 08:48
ya さん、どうも有り難うございました。遅くなってしまってすみません。
教えていただいた通りで動作しました。C++ではBoxing を明示する必要があったのですね。

自分が今回新たに得た知識:
Unlike Visual C#, boxing is not implicit in Managed Extensions for C++ for performance reasons. The user must explicitly box value types where required.
1

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