This documentation is archived and is not being maintained.

ComImportAttribute Class

Indicates that the attributed type was previously defined in COM.

Namespace:  System.Runtime.InteropServices
Assembly:  mscorlib (in mscorlib.dll)

[AttributeUsageAttribute(AttributeTargets::Class|AttributeTargets::Interface, Inherited = false)]
public ref class ComImportAttribute sealed : public Attribute

You can apply this attribute to classes or interfaces, although the Type Library Importer (Tlbimp.exe) typically applies it for you when it imports a type library.

ComImportAttribute is a pseudo-custom attribute that indicates that a type has been defined in a previously published type library. The common language runtime treats these types differently when activating, exporting, coercing, and so on.


All base COM types that are inherited by a managed object must aggregate the Free Threaded Marshaller (FTM). COM types that do not aggregate the FTM can't be inherited by managed objects.

The following example demonstrates how to apply the ComImportAttribute to a managed interface declaration. You apply this attribute only when generating an interop assembly manually in source code, and want to simulate the metadata produced by Tlbimp.exe.

using namespace System;
using namespace System::Runtime::InteropServices;

// If you do not have a type library for an interface 
// you can redeclare it using ComImportAttribute. 
// This is how the interface would look in an idl file. 
//dual, helpstring("IMyStorage Interface"),
//interface IMyStorage : IDispatch 
// [id(1)] 
// HRESULT GetItem([in] BSTR bstrName, [out, retval] IDispatch ** ppItem); 
// [id(2)] 
// HRESULT GetItems([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT)* pItems); 
// [id(3)] 
// HRESULT GetItemDescriptions([in] BSTR bstrLocation, [out] SAFEARRAY(VARIANT) ** ppItems); 
// [id(4), propget] 
// HRESULT get_IsEmpty([out, retval] BOOL * pfEmpty); 
// This is the managed declaration.

interface class IMyStorage
   Object^ GetItem( [In,MarshalAs(UnmanagedType::BStr)]String^ bstrName );

   //[return : MarshalAs(UnmanagedType::Interface)]

   void GetItems( [In,MarshalAs(UnmanagedType::BStr)]String^ bstrLocation, [Out,MarshalAs(UnmanagedType::SafeArray,
   SafeArraySubType=VarEnum::VT_VARIANT)]array<Object^>^Items );

   void GetItemDescriptions( [In]String^ bstrLocation, [In,Out,MarshalAs(UnmanagedType::SafeArray)]array<Object^>^varDescriptions );

   property bool IsEmpty 
      bool get();


Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 7, Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2008 R2, Windows Server 2008, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

.NET Framework

Supported in: 3.5, 3.0, 2.0, 1.1, 1.0

.NET Compact Framework

Supported in: 3.5, 2.0