Introduction
I recently discussed this topic with Chris Maunder on the Message Boards. Chris concluded that ASP.NET does not support Managed C++, well I agree. But it does support MSIL compiled assemblies.
Eventhough the .NET Framework supports many language compilers, ASP.NET has out of the box support for parsing three languages only; C#, VB.NET, JScript. Therefore, we must bypass ASP.NET parser to use a language that ASP.NET does not support. The method we will use to accomplish this is called "code-behind". This method should work for any language that supports a compiler for .NET (e.g. COBOL). I will be demonstrating this technique with the renowned "Hello World" example. This article's only objective is to show you, how to use Managed C++ as code-behind for ASP.NET pages, it doesn't demonstrate any complex C++ coding.
Using Managed C++ as ASP.NET code-behind
First, lets create a simple ASP.NET file called HelloWorldMC.aspx. The most crucial part of this file is Inherits="HelloWorldMC"
, this will tell ASP.NET to look for an assembly (code-behind) file.
<%@ Page AutoEventWireup="false" Inherits="HelloWorldMC" %>
<html>
<head>
<title>HelloWorld MC++</title>
</head>
<body>
<form runat="server" ID="Form1">
<asp:Button id="Button1" runat="server" Text="Click Me Please"
OnClick="SayHello" Width="172px"></asp:Button>
</form>
</body>
</html>
Next we create the Managed C++ file, as our code-behind file named HelloWorldMC.aspx.cpp, I am following the naming convention of Visual Studio.NET here. It is important to keep the names of your server controls consistent between your .aspx file and your .cpp (code-behind) file. For example, id="Button1"
is used in the .aspx file and Button* Button1
is used in the code-benind file, which will bind it to the <asp:Button id="Button1" runat="server"></asp:Button>
control. Also remember that the function SayHello
must be public so the .aspx page can access it.
#using <system.dll>
#using <mscorlib.dll>
#using <system.web.dll>
using namespace System;
using namespace System::Web::UI::WebControls;
public __gc class HelloWorldMC : public System::Web::UI::Page
{
protected:
Button* Button1;
public:
void SayHello (Object* sender, EventArgs* e)
{
Button1->Text = "Hello MC++ World";
return;
}
};
Compiling the project
Make sure that the HelloWorldMC.aspx and HelloWorldMC.aspx.cpp files are placed in the root of your IIS web server (i.e. C:\Inetpub\wwwroot). Now if the subdirectory bin does not exist in the root, create it (i.e. C:\Inetpub\wwwroot\bin). The following command line syntax will compile and create our code-behind file and place it in the bin. Make sure this is ran from the web server root direcotory.
cl /clr HelloWorldMC.aspx.cpp /link /dll /out:bin\HelloWorldMC.dll
Start up your browser and browse the file, http://localhost/HelloWorldMC.aspx, ASP.NET does not care how the code-behind (assembly) was created, as long as it adheres to the Inherits="HelloWorldMC"
in the .aspx file, which tells ASP.NET there is an assembly named HelloWorldMC.dll. Please note that there are advantages to using code-behind techniques in all your ASP.NET programming, to list a couple:
- Compilation before execution
- Seperation of presentation code from business logic
Obtaining Intellisense for .CPP code-behind file, in VS.NET
My suggestion for obtaining intellisense for your .cpp file is, to add a blank Managed C++ project to a currentley existing web project. I tried creating the .cpp code-behind file first, then adding an existing item to my web project and the .cpp file was added to my web project, but the intellisense would not work properly.