Microsoft KB Archive/814358

= Compile error when you try to create an instance of System.Drawing.Imaging.PropertyItem =

Article ID: 814358

Article Last Modified on 12/3/2007

-

APPLIES TO


 * Microsoft .NET Framework 1.1
 * Microsoft .NET Framework 1.0
 * Microsoft Visual Basic .NET 2003 Standard Edition
 * Microsoft Visual C# .NET 2003 Standard Edition
 * Microsoft Visual Basic .NET 2002 Standard Edition
 * Microsoft Visual C# .NET 2002 Standard Edition
 * Microsoft Visual C# 2005 Express Edition
 * Microsoft Visual Basic 2005
 * Microsoft .NET Framework 2.0

-



SYMPTOMS
When you try to create an instance of a PropertyItem object in a project that you try to compile, you receive one of the following error messages:

Visual Basic .NET Error

'System.Drawing.Imaging.PropertyItem.Private Overloads Sub New' is not accessible in this context because it is 'Private'.

Visual Basic 2005 Error

error BC30251: Type 'System.Drawing.Imaging.PropertyItem' has no constructors.

Visual C# .NET Error

'System.Drawing.Imaging.PropertyItem.PropertyItem' is inaccessible due to its protection level.

Visual C# 2005 Error

error CS0143: The type 'System.Drawing.Imaging.PropertyItem' has no constructors defined



CAUSE
A PropertyItem object encapsulates a metadata property to be included in an image file. A PropertyItem object is not intended to be used a stand-alone object. A PropertyItem object is intended to be used by classes that are derived from System.Drawing.Image. A PropertyItem object is used to retrieve and change the metadata of existing image files, not to create the metadata. Therefore, the PropertyItem class does not have a defined Public constructor, and you cannot create an instance of a PropertyItem object.



WORKAROUND
To work around this problem, use an existing PropertyItem object instead of creating a new instance of the PropertyItem class. To do this, use the following code sample:

Visual Basic .NET or Visual Basic 2005 Sample Code
' Create a Bitmap Image to access a PropertyItem object. Dim MyImage As System.Drawing.Bitmap MyImage = New System.Drawing.Bitmap(&quot;C:\Sample.jpg&quot;) ' Refer to some existing .JPEG image.

' Define a PropertyItem variable. Dim pItem As System.Drawing.Imaging.PropertyItem

' Instead of creating a new instance of PropertyItem, use an existing PropertyItem object. For Each pItem In MyImage.PropertyItems ' You can modify the pItem object now. Exit For Next

Visual C# .NET or Visual C# 2005 Sample Code
// Create a Bitmap Image to access a PropertyItem object. System.Drawing.Bitmap MyImage; MyImage = new System.Drawing.Bitmap(&quot;C:\\Sample.jpg&quot;); // Refer to some existing .JPEG image. // Define a PropertyItem variable. // Instead of creating a new instance of PropertyItem, use an existing PropertyItem object. foreach (System.Drawing.Imaging.PropertyItem pItem in MyImage.PropertyItems) {       // You can modify the pItem object now. break; } Note For this code to work correctly, you should have a reference to the System.Drawing.dll assembly.



STATUS
This behavior is by design.



Steps to Reproduce the Behavior
 Open Microsoft Visual Studio .NET or Microsoft Visual Studio 2005. Create a Windows application named PropertyItemDemo by using Visual Basic .NET, Visual Basic 2005, Visual C# 2005, or Visual C# .NET.

By default, Form1 is created.  Append the following code to the Form1_Load event handler:

Visual Basic .NET or Visual Basic 2005 Sample Code Dim pItem As New System.Drawing.Imaging.PropertyItem Visual C# .NET or Visual C# 2005 Sample Code System.Drawing.Imaging.PropertyItem pItem = new System.Drawing.Imaging.PropertyItem;  On the Build menu, click Build Solution.

You receive the error mentioned in the &quot;Symptoms&quot; section of this article.

