以GuidAttribute为例,示例代码为managed c++。
using
namespace
System;
using namespace System::Runtime::InteropServices;
// Guid for the interface IMyInterface.
[Guid( " F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 " )]
public interface class IMyInterface
{
public :
void MyMethod();
};
// Guid for the coclass MyTestClass.
[Guid( " 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 " )]
public ref class MyTestClass: public IMyInterface
{
public :
// Run regasm on this assembly to create .reg and .tlb files.
// Reg file can be used to register this coclass in the registry.
// Tlb file will be used to do interop.
virtual void MyMethod(){}
};
int main()
{
// Example addresses the following in System.Runtime.InterOpServices.GuidAttribute.
// How to specify the attribute on interface/coclass.
// Retrieve the GuidAttribute from an interface/coclass.
// Value property on GuidAttribute class.
// Example addresses the following in System.Guid.
// Constructor Guid(string).
// Constructor Guid(ByteArray).
// Equals.
// Operator ==.
// CompareTo.
Attribute ^ IMyInterfaceAttribute = Attribute::GetCustomAttribute( IMyInterface::typeid, GuidAttribute::typeid );
// The Value property of GuidAttribute returns a string.
System::Console::WriteLine( String::Concat( " IMyInterface Attribute: " , (dynamic_cast < GuidAttribute ^> (IMyInterfaceAttribute)) -> Value ) );
// Using the string to create a guid.
Guid myGuid1 = Guid(dynamic_cast < GuidAttribute ^> (IMyInterfaceAttribute) -> Value);
// Using a byte array to create a guid.
Guid myGuid2 = Guid(myGuid1.ToByteArray());
// Equals is overridden and so value comparison is done though references are different.
if ( myGuid1.Equals( myGuid2 ) )
System::Console::WriteLine( " myGuid1 equals myGuid2 " );
else
System::Console::WriteLine( " myGuid1 not equals myGuid2 " );
// Equality operator can also be used to determine if two guids have same value.
if ( myGuid1 == myGuid2 )
System::Console::WriteLine( " myGuid1 == myGuid2 " );
else
System::Console::WriteLine( " myGuid1 != myGuid2 " );
// CompareTo returns 0 if the guids have same value.
if ( myGuid1.CompareTo( myGuid2 ) == 0 )
System::Console::WriteLine( " myGuid1 compares to myGuid2 " );
else
System::Console::WriteLine( " myGuid1 does not compare to myGuid2 " );
// Output.
// IMyInterface Attribute: F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4
// myGuid1 equals myGuid2
// myGuid1 == myGuid2
// myGuid1 compares to myGuid2
}
using namespace System::Runtime::InteropServices;
// Guid for the interface IMyInterface.
[Guid( " F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4 " )]
public interface class IMyInterface
{
public :
void MyMethod();
};
// Guid for the coclass MyTestClass.
[Guid( " 936DA01F-9ABD-4d9d-80C7-02AF85C822A8 " )]
public ref class MyTestClass: public IMyInterface
{
public :
// Run regasm on this assembly to create .reg and .tlb files.
// Reg file can be used to register this coclass in the registry.
// Tlb file will be used to do interop.
virtual void MyMethod(){}
};
int main()
{
// Example addresses the following in System.Runtime.InterOpServices.GuidAttribute.
// How to specify the attribute on interface/coclass.
// Retrieve the GuidAttribute from an interface/coclass.
// Value property on GuidAttribute class.
// Example addresses the following in System.Guid.
// Constructor Guid(string).
// Constructor Guid(ByteArray).
// Equals.
// Operator ==.
// CompareTo.
Attribute ^ IMyInterfaceAttribute = Attribute::GetCustomAttribute( IMyInterface::typeid, GuidAttribute::typeid );
// The Value property of GuidAttribute returns a string.
System::Console::WriteLine( String::Concat( " IMyInterface Attribute: " , (dynamic_cast < GuidAttribute ^> (IMyInterfaceAttribute)) -> Value ) );
// Using the string to create a guid.
Guid myGuid1 = Guid(dynamic_cast < GuidAttribute ^> (IMyInterfaceAttribute) -> Value);
// Using a byte array to create a guid.
Guid myGuid2 = Guid(myGuid1.ToByteArray());
// Equals is overridden and so value comparison is done though references are different.
if ( myGuid1.Equals( myGuid2 ) )
System::Console::WriteLine( " myGuid1 equals myGuid2 " );
else
System::Console::WriteLine( " myGuid1 not equals myGuid2 " );
// Equality operator can also be used to determine if two guids have same value.
if ( myGuid1 == myGuid2 )
System::Console::WriteLine( " myGuid1 == myGuid2 " );
else
System::Console::WriteLine( " myGuid1 != myGuid2 " );
// CompareTo returns 0 if the guids have same value.
if ( myGuid1.CompareTo( myGuid2 ) == 0 )
System::Console::WriteLine( " myGuid1 compares to myGuid2 " );
else
System::Console::WriteLine( " myGuid1 does not compare to myGuid2 " );
// Output.
// IMyInterface Attribute: F9168C5E-CEB2-4faa-B6BF-329BF39FA1E4
// myGuid1 equals myGuid2
// myGuid1 == myGuid2
// myGuid1 compares to myGuid2
}