3

5、6、7などのビット値を受け入れるパブリックプロパティ「P」を持つC++インターフェイスがあります。そのドキュメントには次のように記載されています。「グループタイプのビットマスクを設定します。ビット5は「a」用、ビット6は「」用です。 b'など。」

私のC#クラスでこのインターフェイスを使用しており、メタデータに表示されるこのプロパティ「P」のタイプは、VS.Netでは「char」です。

6と7のビット値をC#コードからこのプロパティに渡すにはどうすればよいですか?前述のように、タイプ「char」の値はC#からこのC ++インターフェイスに渡される必要があることに注意してください。これは、VS.netのメタデータに表示されるタイプであるためです。

提案してください。コード:

VS.NetIDEから見たC++インターフェイスの定義--

[SuppressUnmanagedCodeSecurity]
    [Guid("f274179c-6d8a-11d2-90fc-00806fa6792c")]
    [InterfaceType(1)]
    public interface IAccount
    {
        char GroupType { get; set; }
    }

C#:

IAccount objAccount= new AccountClass();
((IAccount)objAccount).GroupType = ??//I need to pass char value here

ありがとう。

4

2 に答える 2

4

「byte」から継承した「Enum」タイプを使用できます。

[Flags]
enum BitFlags : byte
{
    One = ( 1 << 0 ),
    Two = ( 1 << 1 ),
    Three = ( 1 << 2 ),
    Four = ( 1 << 3 ),
    Five = ( 1 << 4 ),
    Six = ( 1 << 5 ),
    Seven = ( 1 << 6 ),
    Eight = ( 1 << 7 )
}

void Main()
{
    BitFlags myValue= BitFlags.Six | BitFlags.Seven;

    Console.WriteLine( Convert.ToString( (byte) myValue, 2 ) );
}

出力: 1100000

さらに支援するために、ネイティブメソッドとそれを呼び出す方法に関する詳細情報を投稿する必要があります。

[SuppressUnmanagedCodeSecurity]
[Guid("f274179c-6d8a-11d2-90fc-00806fa6792c")]
[InterfaceType(1)]
public interface IAccount
{
    byte GroupType { get; set; } // char in native C++ is generally going to be 8 bits, this = C# byte
}

IAccount objAccount= new AccountClass();  

( ( IAccount ) objAccount ).GroupType = ( byte )( BitFlags.Six | BitFlags.Seven );
于 2011-06-22T10:59:34.960 に答える
2

C++の型は常に 8 ビットです。これはおそらく、C# で同じものを表すcharために a を使用することを意味します。byte(これは、C++ が 1 バイトとして定義されているため、C++ プラットフォームが標準の 8 ビット バイトを使用していることを前提としていますcharが、C++ の「バイト」は必ずしも 8 ビットであることが保証されているわけではありません!)

byte b = 0;
b |= 1 << 5;    // set bit 5 (assuming that the bit indices are 0-based)
b |= 1 << 6;    // set bit 6 (assuming that the bit indices are 0-based)

その値をどのようにマーシャリングして C++ ルーチンに戻す必要があるかはわかりません。

于 2011-06-22T10:57:58.933 に答える