![Page 1: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/1.jpg)
AP 08/01
Component Programmingwith C# and .NET
• 1st Class Component Support
• Robust and Versionable
• Creating and using attributes
• API integration– DLL import
– COM support
• Preserve Existing Investments
![Page 2: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/2.jpg)
AP 08/01
What defines a component?
• What defines a component?– Properties, methods, events
– Design-time and runtime information
– Integrated help and documentation
• C# has first class support– Not naming patterns, adapters, etc.
– Not external files
• Easy to build and consume
![Page 3: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/3.jpg)
AP 08/01
public class Button: Controlpublic class Button: Control{{ private string caption; private string caption;
public string Caption { public string Caption { get { get { return caption; return caption; } } set { set { caption = value; caption = value; Repaint(); Repaint(); } } } }}}
Properties
• Properties are “smart fields”– Natural syntax, accessors, inlining
Button b = new Button();Button b = new Button();b.Caption = "OK";b.Caption = "OK";String s = b.Caption;String s = b.Caption;
![Page 4: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/4.jpg)
AP 08/01
Indexers
• Indexers are “smart arrays”– Can be overloaded
public class ListBox: Control{ private string[] items;
public string this[int index]{ get { return items[index]; } set { items[index] = value; Repaint(); } }}
ListBox listBox = new ListBox();ListBox listBox = new ListBox();listBox[0] = "hello";listBox[0] = "hello";Console.WriteLine(listBox[0]);Console.WriteLine(listBox[0]);
![Page 5: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/5.jpg)
AP 08/01
Events
• Efficient, type-safe and customizable– Built on delegates
public class MyForm: Form { public MyForm() { Button okButton = new Button(...);
okButton.Click += new EventHandler(OkButtonClick); }
void OkButtonClick(…) { ShowMessage("You clicked OK"); }}
![Page 6: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/6.jpg)
AP 08/01
Design/Runtime Information
• Add information to types + methods?– Transaction required for a method?
– Mark members for persistence?
– Default event hookup?
• Traditional solutions– Lots of custom user code
– Naming conventions between classes
– External files (e.g. .IDL, .DEF)
• The C# solution - Attributes
![Page 7: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/7.jpg)
AP 08/01
Attributes
[HelpUrl([HelpUrl(““http://SomeUrl/Docs/SomeClasshttp://SomeUrl/Docs/SomeClass””)])]class SomeClassclass SomeClass{{ [WebMethod] [WebMethod] void GetCustomers() { void GetCustomers() { …… } }
string Test([SomeAttr] string param1) { string Test([SomeAttr] string param1) {……}}}}
• Appear in square brackets
• Attached to code elements
![Page 8: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/8.jpg)
AP 08/01
Attribute Fundamentals
• Attributes are classes! Completely generic
• Easy to attach to types and members
• Attributes can be queried at runtime
class HelpUrl : System.Attribute { public HelpUrl(string url) { … } …}
[HelpUrl(“http://SomeUrl/APIDocs/SomeClass”)]class SomeClass { … }
Type type = Type.GetType(“SomeClass”);object[] attributes = type.GetCustomAttributes();
![Page 9: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/9.jpg)
AP 08/01
Attributes in .NET
• Web Services
• COM Interop
• Platform Invoke (DLL Interop)
• Transaction Contexts
• Permissions
• Custom XML Persistence
• User-defined attributes to specify non-functionalcomponent properties (RT / FT / Security / Config. )
![Page 10: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/10.jpg)
AP 08/01
XML Comments
• XML schema for comments– Method description
– Parameter types, names and descriptions
– Add your own tags - just XML
• Compiler and IDE support– Compiler creates XML file for all classes
– IDE support for entry and display
• Used throughout .NET Framework
![Page 11: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/11.jpg)
AP 08/01
Using Attributes
[HelpUrl(“http://SomeUrl/APIDocs/SomeClass”)]class SomeClass{ [Obsolete(“Use SomeNewMethod instead”)] public void SomeOldMethod() { … }
public string Test( [SomeAttr()] string param1 ) { … }}
![Page 12: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/12.jpg)
AP 08/01
Using Attributes (contd.)
[HelpUrl("http://SomeUrl/MyClass")]class MyClass {}
[HelpUrl("http://SomeUrl/MyClass”, Tag=“ctor”)]class MyClass {}
[HelpUrl("http://SomeUrl/MyClass"), HelpUrl("http://SomeUrl/MyClass”, Tag=“ctor”)]class MyClass {}
![Page 13: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/13.jpg)
AP 08/01
Querying Attributes
• Use reflection to query attributesType type = typeof(MyClass);
foreach(object attr in type.GetCustomAttributes() ){ if ( attr is HelpUrlAttribute ) { HelpUrlAttribute ha = (HelpUrlAttribute) attr;
myBrowser.Navigate( ha.Url ); }}
![Page 14: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/14.jpg)
AP 08/01
Replication based on Attributes
• Specification of a component‘snon-functional properties atdesign time
• A tool may generate code toautomatically create replicatedobjects
• Component behavior describedby user-defined attributes
namespace CalculatorClass {
using System; using proxy;
[TolerateCrashFaults(4)] public class Calculator {
...
public double add (double x, double y) {
return x + y;
}
}
}
![Page 15: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/15.jpg)
AP 08/01
Behind the scenes...
public sealed class Calculator:CalculatorClass.Calculator {private CalculatorClass.Calculator[] _bc;public Calculator(): base() { _ErrorCount=0; int _Count=1; System.Attribute[] _arAtt =
System.Attribute.GetCustomAttributes(GetType()); foreach(System.Attribute _attr in _arAtt) {
if(_attr is TolerateCrashFaults)_Count=((TolerateCrashFaults)_attr).Count;
}/// creation of sufficiently many proxy objects _bc=new CalculatorClass.Calculator[_Count];
Reflection
Attribute-basedprogramming
![Page 16: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/16.jpg)
AP 08/01
From the consumer‘s perspective
namespace CalculatorFront {
using System;
using CalculatorClass;
public class MainClass {
public MainClass() {}
public static int Main(string[] args) {
Calculator calc = new Calculator();
...
result = calc.add(val1, val2);
/// using CalculatorClass;
using proxy;
Minimal code changes
![Page 17: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/17.jpg)
AP 08/01
Calling Into Existing DLLs
• .NET Framework contains attributes to enable callinginto existing DLLs
• System.Runtime.InteropServices– DLL Name, Entry point, Parameter and Return value marshalling, etc.
• Use these to control calling into your existing DLLs– System functionality is built into Framework
![Page 18: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/18.jpg)
AP 08/01
Attributes to specify DLL Imports
[DllImport("gdi32.dll",CharSet=CharSet.Auto)]public static extern int GetObject( int hObject,
int nSize, [In, Out] ref LOGFONT lf);
[DllImport("gdi32.dll")]public static extern int CreatePen(int style, int width, int color);
![Page 19: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/19.jpg)
AP 08/01
COM Support
• .NET Framework provides greatCOM support– TLBIMP imports existing COM classes
– TLBEXP exports .NET types
• Most users will have a seamless experience
![Page 20: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/20.jpg)
AP 08/01
Calling into a COM component
• Create .NET assembly from COM component via tlbimp
• Client apps may access the newly created assembly
using System;using System.Runtime.InteropServices;
using CONVERTERLib;
class Convert {public static void Main(string [] args) {CFConvert conv = new CFConvert();...fahrenheit = conv.CelsiusToFahrenheit( celsius );
![Page 21: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/21.jpg)
AP 08/01
COM Support
• Sometimes you need more control– Methods with complicated structures
as arguments
– Large TLB – only using a few classes
• System.Runtime.InteropServices– COM object identification
– Parameter and return value marshalling
– HRESULT behavior
![Page 22: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/22.jpg)
AP 08/01
COM SupportExample
[Guid(“56A868B1-0AD4-11CE-B03A-0020AF0BA770”)]interface IMediaControl{ void Run(); void Pause(); void Stop(); … void RenderFile(string strFilename);}
Back to projects
![Page 23: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/23.jpg)
AP 08/01
Win32C++VB6COM
DCOM
CLRFine-grain Integration
XMLHTTP
Course-grain Integration
The Evolution of Components(Microsoft-style)
![Page 24: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/24.jpg)
AP 08/01
COM Type System Internal Type System
Lib1 Lib2 Lib3
Type fragmentation under COM
![Page 25: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/25.jpg)
AP 08/01
CLR Type System
Lib1 Lib2 Lib3
Pervasive Type in the CLR
![Page 26: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/26.jpg)
AP 08/01
XML Type System Internal Type System
Lib1 Lib2 Lib3
Type segregation under XML
![Page 27: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/27.jpg)
AP 08/01
MZ Header
PE Header
COFF HeaderCOFF Header
ExecutableMachine
Code
LoadLibrary
GetProcAddress
Win32
MZ Header
PE Header
COFF HeaderCOFF Header
ExecutableMachine
Code
CoCreateInstance
QueryInterface
COM
MZ Header
PE Header
COFF HeaderCOFF Header
ExecutableIL/Machine
Code
Assembly.Load
GetType
CLR
Type Library CLR Metadata
Object Creation and the Loader
![Page 28: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/28.jpg)
AP 08/01
MZ Header
PE Header
COFF HeaderCOFF Header
Machine Code
MSCOREE.DLL"The Runtime"
MZ Header
PE Header
COFF HeaderCOFF Header
IL/Machine Code
Your ManagedCode
Type LibraryCLR Metadata
MZ Header
PE Header
COFF HeaderCOFF Header
IL/Machine code
MSCORLIB.DLL"The Runtime
Library"
CLR Metadata
CLR Architecture
![Page 29: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/29.jpg)
AP 08/01
~mscoree.dllmscoree.dll
Obj1 CCW
RCW Obj2
on-the-fly COM
• COM callable wrapper (CCW)• runtime callable wrapper (RCW)
![Page 30: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/30.jpg)
AP 08/01
ValueTypeObject
Enum
SByte
Int16
Int32
Int64
Byte
UInt16
UInt32
UInt64
Single
Double
Decimal
Boolean
Char
Delegate
String
struct T
enum T
class T
delegate T
interface T
Array
T [ ]
The CLR Type System
![Page 31: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/31.jpg)
AP 08/01
XML TypeInformation
COM TypeInformation
DBMS TypeInformation
DirectoryType
Information
JVM TypeInformation
Remote methodinvocation
TransparentProxies andInterception
AutomaticSerialization
CodeGeneration
Documentationand Analysis
CLR TypeInformation
Metaprogramming and Reflectionin .NET
![Page 32: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/32.jpg)
AP 08/01
ageid
dead
TypePatient
TypeInt32
TypeDouble
TypeBooleanthis.dead.GetType()
this.age.GetType()
this.id.GetType()
this.GetType() typeof(Patient)
typeof(int)
typeof(double)
typeof(bool)
class Patient{ int id; double age; bool dead;}
Pervasive type and GetType
![Page 33: Component Programming with C# and - uni- · PDF fileComponent Programming with C# and .NET ... design time • A tool may ... public class Calculator {... public double add (double](https://reader031.vdocuments.us/reader031/viewer/2022022422/5a8f05f77f8b9afe568d5f7e/html5/thumbnails/33.jpg)
AP 08/01
TypePatient
TypeInt32
TypeDouble
TypeBoolean
typeof(Patient)
typeof(int)
typeof(double)
typeof(bool)
TypeType
GetType()
GetType()
GetType()
GetType()
typeof(Type)
GetType()
Pervasive type and System.Type
Back to overview