Click here to Skip to main content
15,881,248 members
Articles / Programming Languages / XML
Article

Embed only when you need

Rate me:
Please Sign up or sign in to vote.
4.42/5 (5 votes)
17 Jul 2013CPOL2 min read 11.8K   10   2
Create an embedded-resource-only DLL.

While continuing to play around, and merging the best of ASP.NET controls and jQuery based UI, I came across the decision to create an embedded-resource-only DLL.

This DLL should contain all my JavaScript files as embedded resource with proper mechanism to load them from everywhere in the whole application (including dependencies and duplicates).

It became obvious that with the amount of JavaScript I put into the DLL, those must be minified when deploying.

Easy... I added the 'GoogleClosureCompiler' Custom Tool to every file and voilà! I had it!

So now I have in the same project both the plain and the minified version of the code, so I add some conditions into it to load the right one...

Something like this:

C#
using System;
using System.Web;
using System.Web.UI;

#if DEBUG
[assembly: WebResource( "jquery.js", "text/javascript" )]
[assembly: WebResource( "kendo.core.js", "text/javascript" )]
#else
[assembly: WebResource( "jquery.min.js", "text/javascript" )]
[assembly: WebResource( "kendo.core.min.js", "text/javascript" )]
#endif

namespace Utils
{
 public class JavaScript
 {
  private static int _IncludeID = 0;
  private static int _ScriptPath = 1;

  private static string _Script = 
    "<script javascript="javascript" src="\" text="text" type="\"></script>";

#if DEBUG
  private static string[ ] _jQuery = { "jQueryScriptInclude", "jquery.js" };
  private static string[ ] _Core = { "CoreScriptInclude", "kendo.core.js" };
#else
  private static string[ ] _jQuery = { "jQueryScriptInclude", "jquery.min.js" };
  private static string[ ] _Core = { "CoreScriptInclude", "kendo.core.min.js" };
#endif
  public static void Add ( Page Page, Type Type, string ID, string Name )
  {
   if ( !Page.ClientScript.IsStartupScriptRegistered( Type, ID ) )
   {
    Page.ClientScript.RegisterStartupScript( 
     Type, 
     ID, 
     string.Format( 
      _Script, 
      HttpUtility.HtmlEncode( Page.ClientScript.GetWebResourceUrl( Type, Name ) ) 
     ), 
     false 
    );
   }
  }
 }
}

Look good, isn't it? Event better! It works! Loads the right JavaScript file.

So what's wrong?

Both the plain and the minified files were embedded into both the debug and the release version of the DLL!

In fact, when I started to think about it, found that that was expected. Nobody told the compiler that those files should be included according to some condition... After some search I found that  - apparently - there is no way to tell that!

There is. Not nice, not comfortable, not UI, but there is.

You have to edit the project file. Move files to different ItemGroup and add the proper condition.

Originally, Visual Studio creates the ItemGroup like this:

XML
<itemgroup>
 <embeddedresource include="js\jquery.js">
  <generator>GoogleClosureCompiler</generator>
  <lastgenoutput>jquery.min.js</lastgenoutput>
 </embeddedresource>
 <embeddedresource include="js\jquery.min.js">
  <autogen>True</autogen>
  <designtime>True</designtime>
  <dependentupon>jquery.js</dependentupon>
 </embeddedresource>
 <embeddedresource include="js\kendo.core.js">
  <generator>GoogleClosureCompiler</generator>
  <lastgenoutput>kendo.core.min.js</lastgenoutput>
 </embeddedresource>
 <embeddedresource include="js\kendo.core.min.js">
  <autogen>True</autogen>
  <designtime>True</designtime>
  <dependentupon>kendo.core.js</dependentupon>
 </embeddedresource>
</itemgroup>

All you have to do is separate the plain and the minified files into different ItemGroups, than add some condition, and done...

XML
<itemgroup condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
 <embeddedresource include="js\jquery.js">
  <generator>GoogleClosureCompiler</generator>
  <lastgenoutput>jquery.min.js</lastgenoutput>
 </embeddedresource>
 <embeddedresource include="js\kendo.core.js">
  <generator>GoogleClosureCompiler</generator>
  <lastgenoutput>kendo.core.min.js</lastgenoutput>
 </embeddedresource>
</itemgroup>
<itemgroup condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
 <embeddedresource include="js\jquery.min.js">
  <autogen>True</autogen>
  <designtime>True</designtime>
  <dependentupon>jquery.js</dependentupon>
 </embeddedresource>
 <embeddedresource include="js\kendo.core.min.js">
  <autogen>True</autogen>
  <designtime>True</designtime>
  <dependentupon>kendo.core.js</dependentupon>
 </embeddedresource>
</itemgroup>

For sure it's not too elegant to do it by hand, but there are good things too.

Visual Studio will keep the ItemGroup definitions you created, as long you don't remove the original file. And by the amount of extension we have, for sure someone already working (done?) to add one, that handles this little thing...

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Israel Israel
Born in Hungary, got my first computer at age 12 (C64 with tape and joystick). Also got a book with it about 6502 assembly, that on its back has a motto, said 'Try yourself!'. I believe this is my beginning...

Started to learn - formally - in connection to mathematics an physics, by writing basic and assembly programs demoing theorems and experiments.

After moving to Israel learned two years in college and got a software engineering degree, I still have somewhere...

Since 1997 I do development for living. I used 286 assembly, COBOL, C/C++, Magic, Pascal, Visual Basic, C#, JavaScript, HTML, CSS, PHP, ASP, ASP.NET, C# and some more buzzes.

Since 2005 I have to find spare time after kids go bed, which means can't sleep to much, but much happier this way...

Free tools I've created for you...



Comments and Discussions

 
Questionwell Pin
Yves5-Dec-13 7:30
Yves5-Dec-13 7:30 
AnswerRe: well Pin
Kornfeld Eliyahu Peter5-Dec-13 8:37
professionalKornfeld Eliyahu Peter5-Dec-13 8:37 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.