- Synth is a skinnable look and feel in which all painting is - delegated. Synth does not provide a default look. In - order to use Synth you need to specify a - file, or - provide a {@link - javax.swing.plaf.synth.SynthStyleFactory}. Both - configuration options require an - understanding of the synth architecture, which is described - below, as well as an understanding of Swing's architecture. -
-
- Unless otherwise specified null is not a legal value to any of
- the methods defined in the synth package and if passed in will
- result in a NullPointerException
.
-
-
-
- Each {@link javax.swing.plaf.ComponentUI} implementation in Synth associates
- itself with one {@link
- javax.swing.plaf.synth.SynthStyle} per {@link
- javax.swing.plaf.synth.Region}, most
- Components
only have one Region
and
- therefor only one SynthStyle
.
- SynthStyle
- is used to access all style related properties: fonts, colors
- and other Component
properties. In addition
- SynthStyle
s are used to obtain
- {@link javax.swing.plaf.synth.SynthPainter}s for painting the background, border,
- focus and other portions of a Component
. The ComponentUI
s obtain
- SynthStyle
s from a
- {@link javax.swing.plaf.synth.SynthStyleFactory}.
- A SynthStyleFactory
- can be provided directly by way of
- {@link javax.swing.plaf.synth.SynthLookAndFeel#setStyleFactory(javax.swing.plaf.synth.SynthStyleFactory)},
- or indirectly by way of
- {@link javax.swing.plaf.synth.SynthLookAndFeel#load}. The
- following example uses the SynthLookAndFeel.load()
- method to configure a SynthLookAndFeel
and sets it
- as the current look and feel:
-
- SynthLookAndFeel laf = new SynthLookAndFeel(); + + +++ Synth is a skinnable look and feel in which all painting is + delegated. Synth does not provide a default look. In + order to use Synth you need to specify a + file, or + provide a {@link + javax.swing.plaf.synth.SynthStyleFactory}. Both + configuration options require an + understanding of the synth architecture, which is described + below, as well as an understanding of Swing's architecture. +
++ Unless otherwise specified null is not a legal value to any of + the methods defined in the synth package and if passed in will + result in a
NullPointerException
. + + +Synth
++ Each {@link javax.swing.plaf.ComponentUI} implementation in Synth associates + itself with one {@link + javax.swing.plaf.synth.SynthStyle} per {@link + javax.swing.plaf.synth.Region}, most +
+Components
only have oneRegion
and + therefor only oneSynthStyle
. +SynthStyle
+ is used to access all style related properties: fonts, colors + and otherComponent
properties. In addition +SynthStyle
s are used to obtain + {@link javax.swing.plaf.synth.SynthPainter}s for painting the background, border, + focus and other portions of aComponent
. TheComponentUI
s obtain +SynthStyle
s from a + {@link javax.swing.plaf.synth.SynthStyleFactory}. + ASynthStyleFactory
+ can be provided directly by way of + {@link javax.swing.plaf.synth.SynthLookAndFeel#setStyleFactory(javax.swing.plaf.synth.SynthStyleFactory)}, + or indirectly by way of + {@link javax.swing.plaf.synth.SynthLookAndFeel#load}. The + following example uses theSynthLookAndFeel.load()
+ method to configure aSynthLookAndFeel
and sets it + as the current look and feel: ++-+ SynthLookAndFeel laf = new SynthLookAndFeel(); laf.load(MyClass.class.getResourceAsStream("laf.xml"), MyClass.class); - UIManager.setLookAndFeel(laf); --- Many
JComponent
s are broken down into smaller - pieces and identified by the type safe enumeration in - {@link javax.swing.plaf.synth.Region}. For example, aJTabbedPane
- consists of aRegion
for the -JTabbedPane
({@link - javax.swing.plaf.synth.Region#TABBED_PANE}), the content - area ({@link - javax.swing.plaf.synth.Region#TABBED_PANE_CONTENT}), the - area behind the tabs ({@link - javax.swing.plaf.synth.Region#TABBED_PANE_TAB_AREA}), and the - tabs ({@link - javax.swing.plaf.synth.Region#TABBED_PANE_TAB}). Each -Region
of each -JComponent
will have a -SynthStyle
. This allows - you to customize individual pieces of each region of each -JComponent
. -- Many of the Synth methods take a {@link javax.swing.plaf.synth.SynthContext}. This - is used to provide information about the current -
Component
and includes: the - {@link javax.swing.plaf.synth.SynthStyle} associated with the current - {@link javax.swing.plaf.synth.Region}, the state of theComponent
- as a bitmask (refer to {@link - javax.swing.plaf.synth.SynthConstants} for the valid - states), and a {@link javax.swing.plaf.synth.Region} identifying the portion of - theComponent
being painted. -- All text rendering by non-
- -JTextComponent
s is - delegated to a {@link - javax.swing.plaf.synth.SynthGraphicsUtils}, which is - obtained using the {@link javax.swing.plaf.synth.SynthStyle} method - {@link javax.swing.plaf.synth.SynthStyle#getGraphicsUtils}. You can - customize text rendering - by supplying your own {@link javax.swing.plaf.synth.SynthGraphicsUtils}. - -Notes on specific components
- -JTree
-- Synth provides a region for the cells of a tree: -
Region.TREE_CELL
. To specify the colors of the - renderer you'll want to provide a style for the -TREE_CELL
region. The following illustrates this: -- <style id="treeCellStyle"> - <opaque value="TRUE"/> - <state> - <color value="WHITE" type="TEXT_FOREGROUND"/> - <color value="RED" type="TEXT_BACKGROUND"/> - </state> - <state value="SELECTED"> - <color value="RED" type="TEXT_FOREGROUND"/> - <color value="WHITE" type="BACKGROUND"/> - </state> - </style> - <bind style="treeCellStyle" type="region" key="TreeCell"/> --- This specifies a color combination of red on white, when - selected, and white on red when not selected. To see the - background you need to specify that labels are not opaque. The - following XML fragment does that: -
- <style id="labelStyle"> - <opaque value="FALSE"/> - </style> - <bind style="labelStyle" type="region" key="Label"/> -- -JList and JTable
-- The colors that the renderers for JList and JTable use are - specified by way of the list and table Regions. The following - XML fragment illustrates how to specify red on white, when - selected, and white on red when not selected: -
- <style id="style"> - <opaque value="TRUE"/> - <state> - <color value="WHITE" type="TEXT_FOREGROUND"/> - <color value="RED" type="TEXT_BACKGROUND"/> - <color value="RED" type="BACKGROUND"/> - </state> - <state value="SELECTED"> - <color value="RED" type="TEXT_FOREGROUND"/> - <color value="WHITE" type="TEXT_BACKGROUND"/> - </state> - </style> - <bind style="style" type="region" key="Table"/> - <bind style="style" type="region" key="List"/> -- - + UIManager.setLookAndFeel(laf); +
+ Many JComponent
s are broken down into smaller
+ pieces and identified by the type safe enumeration in
+ {@link javax.swing.plaf.synth.Region}. For example, a JTabbedPane
+ consists of a Region
for the
+ JTabbedPane
({@link
+ javax.swing.plaf.synth.Region#TABBED_PANE}), the content
+ area ({@link
+ javax.swing.plaf.synth.Region#TABBED_PANE_CONTENT}), the
+ area behind the tabs ({@link
+ javax.swing.plaf.synth.Region#TABBED_PANE_TAB_AREA}), and the
+ tabs ({@link
+ javax.swing.plaf.synth.Region#TABBED_PANE_TAB}). Each
+ Region
of each
+ JComponent
will have a
+ SynthStyle
. This allows
+ you to customize individual pieces of each region of each
+ JComponent
.
+
+ Many of the Synth methods take a {@link javax.swing.plaf.synth.SynthContext}. This
+ is used to provide information about the current
+ Component
and includes: the
+ {@link javax.swing.plaf.synth.SynthStyle} associated with the current
+ {@link javax.swing.plaf.synth.Region}, the state of the Component
+ as a bitmask (refer to {@link
+ javax.swing.plaf.synth.SynthConstants} for the valid
+ states), and a {@link javax.swing.plaf.synth.Region} identifying the portion of
+ the Component
being painted.
+
+ All text rendering by non-JTextComponent
s is
+ delegated to a {@link
+ javax.swing.plaf.synth.SynthGraphicsUtils}, which is
+ obtained using the {@link javax.swing.plaf.synth.SynthStyle} method
+ {@link javax.swing.plaf.synth.SynthStyle#getGraphicsUtils}. You can
+ customize text rendering
+ by supplying your own {@link javax.swing.plaf.synth.SynthGraphicsUtils}.
+
+
+ Synth provides a region for the cells of a tree:
+ Region.TREE_CELL
. To specify the colors of the
+ renderer you'll want to provide a style for the
+ TREE_CELL
region. The following illustrates this:
+
+ <style id="treeCellStyle"> + <opaque value="TRUE"/> + <state> + <color value="WHITE" type="TEXT_FOREGROUND"/> + <color value="RED" type="TEXT_BACKGROUND"/> + </state> + <state value="SELECTED"> + <color value="RED" type="TEXT_FOREGROUND"/> + <color value="WHITE" type="BACKGROUND"/> + </state> + </style> + <bind style="treeCellStyle" type="region" key="TreeCell"/> ++
+ This specifies a color combination of red on white, when + selected, and white on red when not selected. To see the + background you need to specify that labels are not opaque. The + following XML fragment does that: +
+ <style id="labelStyle"> + <opaque value="FALSE"/> + </style> + <bind style="labelStyle" type="region" key="Label"/> ++ +
+ The colors that the renderers for JList and JTable use are + specified by way of the list and table Regions. The following + XML fragment illustrates how to specify red on white, when + selected, and white on red when not selected: +
+ <style id="style"> + <opaque value="TRUE"/> + <state> + <color value="WHITE" type="TEXT_FOREGROUND"/> + <color value="RED" type="TEXT_BACKGROUND"/> + <color value="RED" type="BACKGROUND"/> + </state> + <state value="SELECTED"> + <color value="RED" type="TEXT_FOREGROUND"/> + <color value="WHITE" type="TEXT_BACKGROUND"/> + </state> + </style> + <bind style="style" type="region" key="Table"/> + <bind style="style" type="region" key="List"/> ++ + diff --git a/jdk/src/share/demo/jfc/Notepad/resources/Notepad.properties b/jdk/src/share/demo/jfc/Notepad/resources/Notepad.properties index 9f9ec3a7531..fdd5c5a2246 100644 --- a/jdk/src/share/demo/jfc/Notepad/resources/Notepad.properties +++ b/jdk/src/share/demo/jfc/Notepad/resources/Notepad.properties @@ -1,76 +1,76 @@ -# -# Resource strings for Notepad example - -Title=Notepad -ElementTreeFrameTitle=Elements -ViewportBackingStore=false - -# menubar definition -# -# Each of the strings that follow form a key to be -# used to the actual menu definition. -menubar=file edit debug - -# file Menu definition -# -# Each of the strings that follow form a key to be -# used as the basis of a menu item definition. -# -# open -> Notepad.openAction -# new -> Notepad.newAction -# save -> Notepad.saveAction -# exit -> Notepad.exitAction -file=new open save - exit -fileLabel=File -openLabel=Open -openImage=resources/open.gif -newLabel=New -newImage=resources/new.gif -saveLabel=Save -saveImage=resources/save.gif -exitLabel=Exit - -# -# edit Menu definition -# -# cut -> JTextComponent.cutAction -# copy -> JTextComponent.copyAction -# paste -> JTextComponent.pasteAction -edit=cut copy paste - undo redo -editLabel=Edit -cutLabel=Cut -cutAction=cut-to-clipboard -cutImage=resources/cut.gif -copyLabel=Copy -copyAction=copy-to-clipboard -copyImage=resources/copy.gif -pasteLabel=Paste -pasteAction=paste-from-clipboard -pasteImage=resources/paste.gif -undoLabel=Undo -undoAction=Undo -redoLabel=Redo -redoAction=Redo - -# -# debug Menu definition -# -debug=dump showElementTree -debugLabel=Debug -dumpLabel=Dump model to System.err -dumpAction=dump-model -showElementTreeLabel=Show Elements - -# toolbar definition -# -# Each of the strings that follow form a key to be -# used as the basis of the tool definition. Actions -# are of course sharable, and in this case are shared -# with the menu items. -toolbar=new open save - cut copy paste -newTooltip=Create a new file -openTooltip=Open a file -saveTooltip=Save to a file -cutTooltip=Move selection to clipboard -copyTooltip=Copy selection to clipboard -pasteTooltip=Paste clipboard to selection +# +# Resource strings for Notepad example + +Title=Notepad +ElementTreeFrameTitle=Elements +ViewportBackingStore=false + +# menubar definition +# +# Each of the strings that follow form a key to be +# used to the actual menu definition. +menubar=file edit debug + +# file Menu definition +# +# Each of the strings that follow form a key to be +# used as the basis of a menu item definition. +# +# open -> Notepad.openAction +# new -> Notepad.newAction +# save -> Notepad.saveAction +# exit -> Notepad.exitAction +file=new open save - exit +fileLabel=File +openLabel=Open +openImage=resources/open.gif +newLabel=New +newImage=resources/new.gif +saveLabel=Save +saveImage=resources/save.gif +exitLabel=Exit + +# +# edit Menu definition +# +# cut -> JTextComponent.cutAction +# copy -> JTextComponent.copyAction +# paste -> JTextComponent.pasteAction +edit=cut copy paste - undo redo +editLabel=Edit +cutLabel=Cut +cutAction=cut-to-clipboard +cutImage=resources/cut.gif +copyLabel=Copy +copyAction=copy-to-clipboard +copyImage=resources/copy.gif +pasteLabel=Paste +pasteAction=paste-from-clipboard +pasteImage=resources/paste.gif +undoLabel=Undo +undoAction=Undo +redoLabel=Redo +redoAction=Redo + +# +# debug Menu definition +# +debug=dump showElementTree +debugLabel=Debug +dumpLabel=Dump model to System.err +dumpAction=dump-model +showElementTreeLabel=Show Elements + +# toolbar definition +# +# Each of the strings that follow form a key to be +# used as the basis of the tool definition. Actions +# are of course sharable, and in this case are shared +# with the menu items. +toolbar=new open save - cut copy paste +newTooltip=Create a new file +openTooltip=Open a file +saveTooltip=Save to a file +cutTooltip=Move selection to clipboard +copyTooltip=Copy selection to clipboard +pasteTooltip=Paste clipboard to selection diff --git a/jdk/src/share/sample/vm/clr-jvm/Makefile b/jdk/src/share/sample/vm/clr-jvm/Makefile index 2515650d1d5..5b8e6f3b6fa 100644 --- a/jdk/src/share/sample/vm/clr-jvm/Makefile +++ b/jdk/src/share/sample/vm/clr-jvm/Makefile @@ -29,16 +29,16 @@ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # -all: jinvoker.dll invoked.class invoker.exe - -jinvoker.dll: jinvoker.obj Makefile - cl /LD /o jinvoker.dll jinvoker.obj - -jinvoker.obj: jinvoker.cpp jinvokerExp.h Makefile - cl /Fojinvoker.obj /DJINVOKEREEXPORT /c jinvoker.cpp - -invoked.class: invoked.java Makefile - javac invoked.java - -invoker.exe: invoker.cs Makefile - csc /unsafe invoker.cs +all: jinvoker.dll invoked.class invoker.exe + +jinvoker.dll: jinvoker.obj Makefile + cl /LD /o jinvoker.dll jinvoker.obj + +jinvoker.obj: jinvoker.cpp jinvokerExp.h Makefile + cl /Fojinvoker.obj /DJINVOKEREEXPORT /c jinvoker.cpp + +invoked.class: invoked.java Makefile + javac invoked.java + +invoker.exe: invoker.cs Makefile + csc /unsafe invoker.cs diff --git a/jdk/src/share/sample/vm/clr-jvm/README.txt b/jdk/src/share/sample/vm/clr-jvm/README.txt index a081c878c94..52ed44e6d82 100644 --- a/jdk/src/share/sample/vm/clr-jvm/README.txt +++ b/jdk/src/share/sample/vm/clr-jvm/README.txt @@ -1,54 +1,54 @@ -This sample provides Java "Hello World" program that is invoked -from C# application in the same process. - -The problem of direct call of the JVM API from CLR applications -by PInvoke interface is the JVM API functions do not have static -adresses, they need to be got by JNI_CreateJavaVM() call. -The sample contains C++ libraty that wraps JVM API calls by the -static functions that are called from the C# application by -PInvoke interface. - -The sample contains the following files: - -Makefile - make file -README.txt - this readme -invoked.java - the invoked HelloWorld Java program -invoker.cs - C# invoker application -jinvoker.cpp - C++ wrapper -jinvokerExp.h - wrapper library exports - -After the success making the following files are produced: - -invoked.class - the compiled HelloWorld class -invoker.exe - the executable .NET program that invokes Java -jinvoker.dll - the wrapper library - -The following environment needs to be set for the correct sample -build and execution: - -INCLUDE must contain the paths to: - 1. MS Visual C++ standard include - 2. .NET SDK include - 3. Java includes - Example: %MSDEV%/VC98/Include;%DOTNET%/Include;%JAVA_HOME%/include;%JAVA_HOME%/include/win32 - -LIB must contain the paths to: - 1. MS Visual C++ standard libraries - 2. .NET SDK libraries - 3. jvm.dll - Example: %MSDEV%/VC98/Lib;%DOTNET%/Lib;%JAVA_HOME%/jre/bin/client - -PATH must contain the paths to: - 1. MS Visual C++ standard bin - 2. MS Dev common bin - 3. .NET SDK libraries - 4. Java bin - 5. jvm.dll - Example: %MSDEV%/VC98/Bin;%MSDEV%/Common/MSDev98/Bin;%DOTNET%/Lib;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin/client;%PATH% - -To run the sample please do: - - invoker.exe invoked - - ---Dmitry Ryashchentsev +This sample provides Java "Hello World" program that is invoked +from C# application in the same process. + +The problem of direct call of the JVM API from CLR applications +by PInvoke interface is the JVM API functions do not have static +adresses, they need to be got by JNI_CreateJavaVM() call. +The sample contains C++ libraty that wraps JVM API calls by the +static functions that are called from the C# application by +PInvoke interface. + +The sample contains the following files: + +Makefile - make file +README.txt - this readme +invoked.java - the invoked HelloWorld Java program +invoker.cs - C# invoker application +jinvoker.cpp - C++ wrapper +jinvokerExp.h - wrapper library exports + +After the success making the following files are produced: + +invoked.class - the compiled HelloWorld class +invoker.exe - the executable .NET program that invokes Java +jinvoker.dll - the wrapper library + +The following environment needs to be set for the correct sample +build and execution: + +INCLUDE must contain the paths to: + 1. MS Visual C++ standard include + 2. .NET SDK include + 3. Java includes + Example: %MSDEV%/VC98/Include;%DOTNET%/Include;%JAVA_HOME%/include;%JAVA_HOME%/include/win32 + +LIB must contain the paths to: + 1. MS Visual C++ standard libraries + 2. .NET SDK libraries + 3. jvm.dll + Example: %MSDEV%/VC98/Lib;%DOTNET%/Lib;%JAVA_HOME%/jre/bin/client + +PATH must contain the paths to: + 1. MS Visual C++ standard bin + 2. MS Dev common bin + 3. .NET SDK libraries + 4. Java bin + 5. jvm.dll + Example: %MSDEV%/VC98/Bin;%MSDEV%/Common/MSDev98/Bin;%DOTNET%/Lib;%JAVA_HOME%/bin;%JAVA_HOME%/jre/bin/client;%PATH% + +To run the sample please do: + + invoker.exe invoked + + +--Dmitry Ryashchentsev diff --git a/jdk/src/share/sample/vm/clr-jvm/invoker.cs b/jdk/src/share/sample/vm/clr-jvm/invoker.cs index 7e5646230bf..b4ae1bb3d0a 100644 --- a/jdk/src/share/sample/vm/clr-jvm/invoker.cs +++ b/jdk/src/share/sample/vm/clr-jvm/invoker.cs @@ -29,30 +29,30 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* -*/ - +/* +*/ + using System; using System.Runtime.InteropServices; class jinvoker{ public static int Main(string[] aArgs){ - - // Print Hello to show we are in CLR - Console.WriteLine("Hello from C#"); - if(aArgs.Length > 0) - // invoke JVM - return InvokeMain(aArgs[0]); - else - return -1; + + // Print Hello to show we are in CLR + Console.WriteLine("Hello from C#"); + if(aArgs.Length > 0) + // invoke JVM + return InvokeMain(aArgs[0]); + else + return -1; } // Link the JVM API functions and the wrappers [DllImport("jvm.dll")] public unsafe static extern int JNI_CreateJavaVM(void** ppVm, void** ppEnv, void* pArgs); [DllImport("jinvoker.dll")] public unsafe static extern int MakeJavaVMInitArgs( void** ppArgs ); - [DllImport("jinvoker.dll")] public unsafe static extern void FreeJavaVMInitArgs( void* pArgs ); + [DllImport("jinvoker.dll")] public unsafe static extern void FreeJavaVMInitArgs( void* pArgs ); [DllImport("jinvoker.dll")] public unsafe static extern int FindClass( void* pEnv, String sClass, void** ppClass ); [DllImport("jinvoker.dll")] public unsafe static extern int GetStaticMethodID( void* pEnv, void* pClass, @@ -73,7 +73,7 @@ class jinvoker{ [DllImport("jinvoker.dll")] public unsafe static extern int DestroyJavaVM( void* pJVM ); public unsafe static int InvokeMain( String sClass ){ - + void* pJVM; // JVM struct void* pEnv; // JVM environment void* pVMArgs; // VM args @@ -81,23 +81,23 @@ class jinvoker{ void* pMethod; // The executed method struct void* pArgs; // The executed method arguments struct - // Fill the pVMArgs structs + // Fill the pVMArgs structs MakeJavaVMInitArgs( &pVMArgs ); - // Create JVM + // Create JVM int nRes = JNI_CreateJavaVM( &pJVM, &pEnv, pVMArgs ); if( nRes == 0 ){ - - // Find the executed method class + + // Find the executed method class if(FindClass( pEnv, sClass, &pClass) == 0 ) - - // Find the executed method + + // Find the executed method if( GetStaticMethodID( pEnv, pClass, "main", "([Ljava/lang/String;)V", &pMethod ) == 0 ) - - // Create empty String[] array to pass to the main() + + // Create empty String[] array to pass to the main() if( NewObjectArray( pEnv, 0, "java/lang/String", &pArgs ) == 0 ){ - - // Call main() + + // Call main() nRes = CallStaticVoidMethod( pEnv, pClass, pMethod, pArgs ); if( nRes != -1 ) Console.WriteLine("Result:"+nRes); @@ -116,16 +116,16 @@ class jinvoker{ Console.WriteLine("can not find class:"+sClass); nRes = -102; } - - // Destroy the JVM + + // Destroy the JVM DestroyJavaVM( pJVM ); }else - Console.WriteLine("Can not create Java VM"); - - // Free the JVM args structs + Console.WriteLine("Can not create Java VM"); + + // Free the JVM args structs FreeJavaVMInitArgs(pVMArgs); - + return nRes; } } diff --git a/jdk/src/share/sample/vm/jvm-clr/README.txt b/jdk/src/share/sample/vm/jvm-clr/README.txt index a8fe79db343..1d1c2f4bb12 100644 --- a/jdk/src/share/sample/vm/jvm-clr/README.txt +++ b/jdk/src/share/sample/vm/jvm-clr/README.txt @@ -42,10 +42,10 @@ PATH must contain the paths to: 3. .NET SDK libraries 4. Java bin Example: %MSDEV%/VC98/Bin;%MSDEV%/Common/MSDev98/Bin;%DOTNET%/Lib;%JAVA_HOME%/bin;%PATH% - -To run the sample please do: - -java invoker invoked.exe - - ---Dmitry Ryashchentsev + +To run the sample please do: + +java invoker invoked.exe + + +--Dmitry Ryashchentsev diff --git a/jdk/src/share/sample/vm/jvm-clr/invoked.cs b/jdk/src/share/sample/vm/jvm-clr/invoked.cs index 1904bb7191b..e5eead480af 100644 --- a/jdk/src/share/sample/vm/jvm-clr/invoked.cs +++ b/jdk/src/share/sample/vm/jvm-clr/invoked.cs @@ -29,17 +29,17 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* -*/ - - +/* +*/ + + using System; class App{ public static int Main(){ - - // Print Hello to show we are in CLR + + // Print Hello to show we are in CLR Console.WriteLine("Hello from C#!!!"); return 0; }