Re: Fruit basket program in C++/CLI

  • From: "Will Pearson" <will@xxxxxxxxxxxxx>
  • To: <programmingblind@xxxxxxxxxxxxx>
  • Date: Tue, 20 Nov 2007 17:12:54 -0000

Hi Jamal,

From what I understood from what I heard from the VC team around the time they were working on C++/CLI the /clr switch and options refer to how the compiler converts your code. So, /clr will compile what it can into MSIL and compile everything else into native assembly, /clr:pure will only compile to MSIL and will throw compiler errors if there is anything that won't go to MSIL, and /clr:safe does the same as /clr:pure but with added verifiability. The semantic context for the /clr options seems to be how your code is treated and not the state of the resulting assembly.

I think that you do get a pure MSIL assembly when you use /clr:pure. I was taking a look around the web and came across this statement:
"There is no CRT support for verifiable
assemblies. (CRT support is available to pure assemblies through a Pure MSIL version of the C Runtime library.)" [1] So, it looks as though the version of the CRT that gets linked in when you use /clr:pure is an MSIL version of the CRT. I guess it was included to enable people to use familiar CRT functions and templates within managed code, which I assume was something added to help people transition their code to managed code.

[1] Microsoft Corperation, (2005), 'Pure and Verifiable Code', Taken from the web: http://msdn2.microsoft.com/en-us/library/85344whh(VS.80).aspx, Last accessed: 20/11/2007

Will
----- Original Message ----- From: "Jamal Mazrui" <empower@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx>
Sent: Tuesday, November 20, 2007 4:38 PM
Subject: Re: Fruit basket program in C++/CLI


I guess I find the use of the word "pure" in /clr:pure to be a bit
misleading, since the target executable is not a stand-alone .NET
assembly without other dependencies.  Since it is with /clr:safe,
however, there is no problem once one understands the syntax.

FYI -- Here is the manifest created by the /clr option:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1'
manifestVersion='1.0'>
 <dependency>
   <dependentAssembly>
     <assemblyIdentity type='win32' name='Microsoft.VC80.CRT'
version='8.0.50608.0' processorArchitecture='x86'
publicKeyToken='1fc8b3b9a1e18e3b' />
   </dependentAssembly>
 </dependency>
</assembly>


Here is the manifest created by the /clr:pure option:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1'
manifestVersion='1.0'>
 <dependency>
   <dependentAssembly>
     <assemblyIdentity type='win32' name='Microsoft.VC80.CRT'
version='8.0.50608.0' processorArchitecture='x86'
publicKeyToken='1fc8b3b9a1e18e3b' />
   </dependentAssembly>
 </dependency>
</assembly>

Jamal

On Tue, 20 Nov 2007,
Will Pearson
wrote:

Date: Tue, 20 Nov 2007 08:40:36 -0000
From: Will Pearson <will@xxxxxxxxxxxxx>
Reply-To: programmingblind@xxxxxxxxxxxxx
To: programmingblind@xxxxxxxxxxxxx
Subject: Re: Fruit basket program in C++/CLI

Hi Jamal,

The error is because the system can't find msvcrt80.dll or one of the other
CRT DLL's.  The first error message you mentioned is one that I've come
across before, although in a different context. There's probably a bit more information regarding that error in one of the system logs, and I suspect it
would be logged as a Win SXS error.

The manifest tells the system that the application uses side by side
assemblies. This effectively adds c:\windows\winsxs to the DLL search path,
which is the folder where side by side assemblies are installed to.  The
manifest also tells the loader which version to load.  If that version
cannot be located in the winsxs folder then you'll also get an error. This is an important point because Visual Studio 2005 and Visual Studio 2005 SP1
ship different versions of the CRT.

The manifests for side by side assemblies can either be embedded into a
binary, such as an exe or DLL, or left as standalone XML files.  What you
seem to have is a standalone XML file for your application. I think the IDE takes a few extra steps to embed the manifest into the application. As you
are using command line tools then you will have to do this extra work by
hand using the manifest tool mt.exe.

I don't think you can avoid a manifest if you create mixed native/managed
code. The /clr and /clr:pure options require msvcm80.dll. As this is a DLL
associated with the CRT then it will be installed into the winsxs folder.
When I took a look at the list of CRT libraries and DLL's that Microsoft
provide for Visual C++ 2005 I couldn't find a static link alternative for
msvcm80.dll.  The only way to get the necessary functionality is to use
msvcm80.dll.

Will
----- Original Message -----
From: "Jamal Mazrui" <empower@xxxxxxxxx>
To: <programmingblind@xxxxxxxxxxxxx>
Sent: Monday, November 19, 2007 7:36 PM
Subject: Re: Fruit basket program in C++/CLI


Hi Will,
Unlike the /clr:safe option, I found that both the /clr and /clr:pure
options produce a .manifest file that is required for the program to
run.

If I delete the .manifest file after compiling with the /clr option, I
get the following error in a message box:

cli_fruit.exe - Application Error
The application failed to initialize properly (0x80000003). Click on OK
to terminate the application.

If I delete the .manifest file after compiling with the /clr:pure
option, I get the following error in a message box:

Microsoft Visual C++ Runtime Library
Runtime Error! Program: c:\cli_fruit\cli_fruit.exe
R6034
An application has made an attempt to load the C runtime library
incorrectly.
Please contact the application's support team for more information.

With the /clr:pure option, after clearing the message box, I get the
following error printed to the console by the .NET runtime:

Unhandled Exception: System.TypeInitializationException: The type
initializer for '<Module>' threw an exception. --->
System.DllNotFoundException: Unable to load DLL 'msvcm80.dll': A dynamic
link library (DLL) initialization routine failed.
 (Exception from HRESULT: 0x8007045A)
at <CrtImplementationDetails>.ThrowModuleLoadException(String ,
Exception )
at
<CrtImplementationDetails>.LanguageSupport.Initialize(LanguageSupport* )
at .cctor()
--- End of inner exception stack trace ---

Jamal

On
Mon, 19 Nov 2007, Will
Pearson wrote:

> Date: Mon, 19 Nov 2007 18:17:11 -0000
> From: Will Pearson <will@xxxxxxxxxxxxx>
> Reply-To: programmingblind@xxxxxxxxxxxxx
> To: programmingblind@xxxxxxxxxxxxx
> Subject: Re: Fruit basket program in C++/CLI
>
> Hi Jamal,
>
> What was the dependancy? /clr will also require the c run-time as you > are
> using native code.
>
> If the dependancy that you got was the CRT then it explains why you > might
> need another manifest.  In Visual Studio 2005 the VC team decided to
> deploy
> the DLL versions of the CRT as side by side assemblies.  These are not
> assemblies in the .Net sense of the term but they do contain manifests
> just
> like .Net assemblies. Windoes XP introduced a new way of deploying > DLL's
> to
> try to decrease DLL hell, and this new deployment method is known as > side
> by
> side assemblies or sxs for short.  SXS uses a manifest to specify a DLL
> version, if the assembly is a DLL, any dependancies that the DLL or exe
> has,
> and a bit of COM information, such as GUID's, if the assembly uses COM.
> The
> manifest can store more meta data but those are the common things that > you > find. The manifest schema is the same one that .Net assemblies use > and
> it
> is documented in the MSDN library.  Just as with the .Net framework
> assemblies, any native exe that uses an sxs assembly needs to include a
> manifest to specify that dependancy and version information.  So, you
> would
> need to include this if you were using the CRT.  Other example of an sxs
> assembly is the common controls v6.
>
> It might be that the two manigests failed to merge, weren't created, or
> otherwise got messed up if your dependancy error was on the CRT.
>
> Will
> ----- Original Message -----
> From: "Jamal Mazrui" <empower@xxxxxxxxx>
> To: <programmingblind@xxxxxxxxxxxxx>
> Sent: Monday, November 19, 2007 5:41 PM
> Subject: Re: Fruit basket program in C++/CLI
>
>
> FYI -- I was unable to create a stand-alone fruit basket executable with
> the /clr or /clr:pure parameters.  Dependencies to other files remained,
> which had to be available on the existing search paths, specified in a
> seperate manifest file, or included in the same directory as the
> executable.  The /clr:safe parameter, however, did create a stand-alone,
> .NET-based executable.
>
> Jamal
> On Mon, 19 Nov 2007, Will Pearson wrote:
>
> > Date: Mon, 19 Nov 2007 16:49:58 -0000
> > From: Will Pearson <will@xxxxxxxxxxxxx>
> > Reply-To: programmingblind@xxxxxxxxxxxxx
> > To: programmingblind@xxxxxxxxxxxxx
> > Subject: Re: Fruit basket program in C++/CLI
> >
> > Hi,
> >
> > cl.exe has thre modes for compiling C++/CLI:
> > - /clr
> > This is the C++ interop mode.  It enables native and managed code to
> > coexist
> > together.  Importantly, it is the only clr option that allows you to
> > still
> > use pointers in your code.  This means you can use callbacks and other
> > places where pointers are typically found in native API's.  As both
> > native
> > and managed code can coexist together you can create a project that > > uses
> > both the Windows API and the .Net Framework.  These are known as mixed
> > assemblies in .Net terminology.
> >
> > - /clr:pure
> > Will compile all the code to IL and produce a pure .Net assembly. > > This
> > means that you can't use native API's from within your code unless you
> > use
> > the interop methods provided by the .Net Framework, such as P/Invoke > > or
> > COM
> > interop.
> >
> > - /clr:safe
> > Produces a .Net assembly that is verifiable.
> >
> > Will
> > ----- Original Message -----
> > From: "jaffar" <jaffar@xxxxxxxxxxxxx>
> > To: <programmingblind@xxxxxxxxxxxxx>
> > Sent: Monday, November 19, 2007 4:29 PM
> > Subject: Re: Fruit basket program in C++/CLI
> >
> >
> > Hi Marlon. At least for the other editions of Visual Studio apart > > from
> > the
> > express which i cannot be sure off, you can actually make changes to
> > your
> > compiler options so that it can compile either native c++ code or
> > microsoft's cli version of c++ or both.  For example, You can turn off
> > the
> > _T identifier needed to compile character sequences in your code and
> > revert
> > to the standard CHAR used by native C++.  Cheers!
> > ----- Original Message -----
> > From: "Marlon Brandão de Sousa" <splyt.lists@xxxxxxxxx>
> > To: <programmingblind@xxxxxxxxxxxxx>
> > Sent: Monday, November 19, 2007 10:38 PM
> > Subject: Re: Fruit basket program in C++/CLI
> >
> >
> > hmm Jamal, correct me if I am wrong, but my understanding is that one
> > can't compile binary, native win32 executable if they use the cli
> > part.
> > Sure visual C can generate binaries for win32, but if you use the
> > extensions, at least based on what I have understood, the .net
> > dependencies will be kept ...
> > In other words I can use visual C to develope binaries in raw c++ but
> > not in the cli version, using visual c.
> > Marlon
> >
> > 2007/11/19, Jamal Mazrui <empower@xxxxxxxxx>:
> > > Yes, my undrstanding is that C++/CLI is essentially for C++ > > > developers > > > who want to take advantage of the .NET Framework with the language > > > and
> > > associated features to which they have become accustomed.  Microsoft
> > > submitted the language for international standardization, and this > > > has
> > > occurred, so theoretically other software publishers and platforms
> > > could
> > > develop compilers for C++/CLI besides Microsoft Visual C++.  It is
> > > unlikely that will happen practically speaking, however, because of
> > > the
> > > inherent relation to .NET 2.0.
> > >
> > > It is noteworthy that Microsoft's compiler can be used to create
> > > native
> > > Win32 executables in standard C++ without any .NET dependencies.  In
> > > other words, the CLI aspect adds language extensions, but not
> > > requirements for a traditional C++ developer.
> > >
> > > Jamal
> > > On Mon, 19 Nov 2007, Marlon
> > > Brandão de Sousa wrote:
> > >
> > > > Date: Mon, 19 Nov 2007 09:32:13 -0200
> > > > From: Marlon Brandão de Sousa <splyt.lists@xxxxxxxxx>
> > > > Reply-To: programmingblind@xxxxxxxxxxxxx
> > > > To: programmingblind@xxxxxxxxxxxxx
> > > > Subject: Re: Fruit basket program in C++/CLI
> > > >
> > > > Only to clarify, Lamar, this isn't c or c++. This is c Cli, which
> > > > means it is a c++ modified language which allows the use of the > > > > .net > > > > stuff. If you want to develope for anything portable or non > > > > windows
> > > > keep away from this for now and go learn the c++ language.
> > > > This version of c++, the cli one, introduces some sintactical
> > > > modifications (e.e the ^ symbol which seen to be a kind of > > > > pointer),
> > > > and some other new things, but it won't compile out of microsoft
> > > > compilers and it won't run out of windows ... well it won't run > > > > even
> > > > on windows , if the .net is not installed on it.
> > > >
> > > > 2007/11/19, jaffar <jaffar@xxxxxxxxxxxxx>:
> > > > > Hi Lamar.  No.  You'll need at least the .net 2.0 runtime to be
> > > > > able
> > > > > to
> > > run
> > > > > it.  Cheers!
> > > > > ----- Original Message -----
> > > > > From: "Lamar Upshaw" <lupshaw@xxxxxxxxxxxxxx>
> > > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > > Sent: Monday, November 19, 2007 4:30 PM
> > > > > Subject: Re: Fruit basket program in C++/CLI
> > > > >
> > > > >
> > > > > > Just to clarify, I should be able to run this using minGW,
> > > > > > correct?
> > > > > >
> > > > > > With All Respect,
> > > > > > Upshaw, Lamar T
> > > > > > ----- Original Message -----
> > > > > > From: "Jamal Mazrui" <empower@xxxxxxxxx>
> > > > > > To: <programmingblind@xxxxxxxxxxxxx>
> > > > > > Sent: Sunday, November 18, 2007 8:14 PM
> > > > > > Subject: Fruit basket program in C++/CLI
> > > > > >
> > > > > >
> > > > > >> From the archive at
> > > > > >> http://www.EmpowermentZone.com/cli_fruit.zip
> > > > > >>
> > > > > >> This fruit basket program is written in C++/CLI:  the C++
> > > > > >> language
> > > with
> > > > > >> extensions to support the Common Language Infrastructure of > > > > > >> the
> > > > > >> .NET
> > > > > >> Framework.  C++/CLI can create native Win32 executables or
> > > > > >> libraries,
> > > > > >> .NET-based ones, or a combination of both. Related > > > > > >> development
> > > resources
> > > > > >> that are freely available from Microsoft.com include the
> > > > > >> following:
> > > the
> > > > > >> .NET Framework 2.0 SDK, the Microsoft Platform SDK for > > > > > >> Windows
> > > > > >> Server
> > > > > >> 2003, and Visual C++ 2005 Express Edition.
> > > > > >>
> > > > > >> The archive includes a batch file, compile.bat, which invokes
> > > > > >> the
> > > > > >> command-line compiler to create an executable, cli_fruit.exe,
> > > > > >> which
> > > is
> > > > > >> about 5K in size. The batch file initially sets > > > > > >> environmental
> > > variables
> > > > > >> that may need to be tweaked on another computer so that
> > > > > >> appropriate
> > > > > >> directories are referenced.
> > > > > >>
> > > > > >> Besides the resulting executable, No other files are needed > > > > > >> to
> > > > > >> run
> > > the
> > > > > >> program -- as long as .NET 2.0 is installed.   The included
> > > > > >> Source
> > > code
> > > > > >> is
> > > > > >> also pasted below.
> > > > > >>
> > > > > >> Jamal
> > > > > >>
> > > > > >> /*;
> > > > > >> content of cli_fruit.cpp;
> > > > > >> Fruit Basket program in C++/CLI
> > > > > >> //public domain by Jamal Mazrui
> > > > > >> */;
> > > > > >>
> > > > > >> // Reference libraries
> > > > > >> #using <System.dll>
> > > > > >> #using <System.Windows.Forms.dll>
> > > > > >>
> > > > > >> // Import namespaces
> > > > > >> using namespace System;
> > > > > >> using namespace System::Windows::Forms;
> > > > > >>
> > > > > >> // Define class
> > > > > >> ref class FruitBasket : public Form {
> > > > > >> public :
> > > > > >> //Define constructor
> > > > > >> FruitBasket() {
> > > > > >> // Initialize controls and set properties
> > > > > >> tlp = gcnew TableLayoutPanel();
> > > > > >> tlp->ColumnCount = 3;
> > > > > >> tlp->RowCount = 2;
> > > > > >>
> > > > > >> lblFruit = gcnew Label();
> > > > > >> lblFruit->Text = "&Fruit:";
> > > > > >> tlp->Controls->Add(lblFruit);
> > > > > >>
> > > > > >> txtFruit = gcnew TextBox();
> > > > > >> tlp->Controls->Add(txtFruit);
> > > > > >>
> > > > > >> btnAdd = gcnew Button();
> > > > > >> btnAdd->Text = "&Add";
> > > > > >> btnAdd->Click += gcnew EventHandler(this,
> > > &FruitBasket::Button_Click);
> > > > > >> tlp->Controls->Add(btnAdd);
> > > > > >>
> > > > > >> lblBasket = gcnew Label();
> > > > > >> lblBasket->Text = "&Basket:";
> > > > > >> tlp->Controls->Add(lblBasket);
> > > > > >>
> > > > > >> lstBasket = gcnew ListBox();
> > > > > >> tlp->Controls->Add(lstBasket);
> > > > > >>
> > > > > >> btnDelete = gcnew Button();
> > > > > >> btnDelete->Text = "&Delete";
> > > > > >> btnDelete->Click += gcnew EventHandler(this,
> > > &FruitBasket::Button_Click);
> > > > > >> tlp->Controls->Add(btnDelete);
> > > > > >>
> > > > > >> Text = "Fruit Basket";
> > > > > >> AcceptButton = btnAdd;
> > > > > >> StartPosition = FormStartPosition::CenterScreen;
> > > > > >> AutoSize = true;
> > > > > >> AutoSizeMode =
> > > > > >> System::Windows::Forms::AutoSizeMode::GrowAndShrink;
> > > > > >> Controls->Add(tlp);
> > > > > >> } // FruitBasket constructor
> > > > > >>
> > > > > >> // Define destructor
> > > > > >> virtual ~FruitBasket() {
> > > > > >> } // FruitBasket destructor
> > > > > >>
> > > > > >> // Define event handler;
> > > > > >> void Button_Click(Object^ sender, EventArgs^ e) {
> > > > > >> if (sender == btnAdd) {
> > > > > >> String^ sFruit = txtFruit->Text->Trim();
> > > > > >> if (sFruit->Length == 0) {
> > > > > >> MessageBox::Show("No fruit to add!", "Alert");
> > > > > >> return;
> > > > > >> }
> > > > > >>
> > > > > >> lstBasket->Items->Add(sFruit);
> > > > > >> txtFruit->Clear();
> > > > > >> lstBasket->SelectedIndex = lstBasket->Items->Count - 1;
> > > > > >> }
> > > > > >> else if (sender == btnDelete) {
> > > > > >> int iFruit = lstBasket->SelectedIndex;
> > > > > >> if (iFruit == -1) {
> > > > > >> MessageBox::Show("No fruit to delete->", "Alert");
> > > > > >> return;
> > > > > >> }
> > > > > >>
> > > > > >> lstBasket->Items->RemoveAt(iFruit);
> > > > > >> if (iFruit == lstBasket->Items->Count) iFruit--;
> > > > > >> lstBasket->SelectedIndex = iFruit;
> > > > > >> }
> > > > > >> } // Button_Click event handler
> > > > > >>
> > > > > >> // Declare controls;
> > > > > >> TableLayoutPanel^ tlp;
> > > > > >> Label^ lblFruit;
> > > > > >> TextBox^ txtFruit;
> > > > > >> Button^ btnAdd;
> > > > > >> Label^ lblBasket;
> > > > > >> ListBox^ lstBasket;
> > > > > >> Button^ btnDelete;
> > > > > >> }; // FruitBasket class
> > > > > >>
> > > > > >> // Define entry point of program
> > > > > >> int main() {
> > > > > >> Application::Run(gcnew FruitBasket());
> > > > > >> return 0;
> > > > > >> } // main method
> > > > > >>
> > > > > >> // End of cli_fruit.cpp
> > > > > >>
> > > > > >> __________
> > > > > >> View the list's information and change your settings at
> > > > > >> //www.freelists.org/list/programmingblind
> > > > > >>
> > > > > >
> > > > > > __________
> > > > > > View the list's information and change your settings at
> > > > > > //www.freelists.org/list/programmingblind
> > > > > >
> > > > >
> > > > > __________
> > > > > View the list's information and change your settings at
> > > > > //www.freelists.org/list/programmingblind
> > > > >
> > > > >
> > > >
> > > >
> > > > --
> > > > When you say "I wrote a program that crashed Windows," people just
> > > > stare at you blankly and say "Hey, I got those with the system, > > > > for
> > > > free."
> > > > Linus Torvalds
> > > > __________
> > > > View the list's information and change your settings at
> > > > //www.freelists.org/list/programmingblind
> > > >
> > > __________
> > > View the list's information and change your settings at
> > > //www.freelists.org/list/programmingblind
> > >
> > >
> >
> >
> > --
> > When you say "I wrote a program that crashed Windows," people just
> > stare at you blankly and say "Hey, I got those with the system, for
> > free."
> > Linus Torvalds
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> >
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> > __________
> > View the list's information and change your settings at
> > //www.freelists.org/list/programmingblind
> >
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
> __________
> View the list's information and change your settings at
> //www.freelists.org/list/programmingblind
>
__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind
__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind

__________
View the list's information and change your settings at
//www.freelists.org/list/programmingblind
__________
View the list's information and change your settings at //www.freelists.org/list/programmingblind

Other related posts: