Thursday, 24 January 2013

Using embedded resources with .NET assemblies

When creating a custom task or other component that will plug into a web application it is often useful to embed the resources for that component in the assembly itself. This greatly simplifies deployment because you will only need to deploy the assembly instead of all the external resources like JS files or images.
Here are some simple instructions for using embedded resources.
  1. Add the resource to the project (Right-click the project in the solution explorer and click Add > Existing item).
  2. Set the Build Action property of the file to Embedded Resource. (Right-click the file in the solution explorer and click Properties).
  3. Add a WebResource attribute to AssemblyInfo.cs. Like this:

  4. [assembly: System.Web.UI.WebResource("esri_samples.esriZoomIn.png", "img/png")]
    In this example esri_samples is the default names namespace. To see the default namespace right-click your project in the solution explorer and click Properties. The default namespace can be found on the Application tab. esriZoomIn.png is the name of the file. img/png is the type. Below is another example for a javascript file.
    [assembly: System.Web.UI.WebResource("stl_samples.clipboard.js", "text/javascript")]
    In this example stl_samples is the default namespace and notice the type is now text/javascript.
  5. Use the ClientScript manager to use the resource.
    • For images the GetWebResourceUrl method will get you a URL to the image. For example the following code gets a url for the esriZoomIn image embedded above.
      string sZoomUrl = 
      Page.ClientScript.GetWebResourceUrl(this.GetType(), "esri_samples.esriZoomIn.png");
    • For JavaScript, you need to specify where you want the file included in the page. First you get a URL for the resource like the image example above, then you use the ScriptManager to register the client script. If you want the script to be executed when the page loads, use RegisterStartupScript. RegisterStartupScript will insert the script at the bottom of the form (just before the </form>), so it will be executed after the rest of the DOM elements on the page are loaded.
      If you want to include JavaScript that can be called from events on the page, use RegisterClientScriptInclude. This adds a script within the form where the control tag is located.
      With each approach the JavaScript is executed when the parser hits the tag. The important thing is that you don’t try to access, for instance, DOM elements from a script registered using RegisterClientScriptInclude, because those DOM elements might not be available. So these scripts are often used for declaring a set of script methods/classes for later use. Of course the major difference with RegisterClientScriptInclude is that it references a file where RegisterStartupScript contains a piece of JavaScript (it could just as well be a JavaScript file you reference, although this is not the intended way of using it). Each of these registration methods should be called in the PreRender event of the control or page. Below is an example of adding the clipboard.js file to the page.
      protected override void OnPreRender(EventArgs e) 
      //Embed the javascript in the page 
      string scriptLocation = 
      this.Page.ClientScript.GetWebResourceUrl(this.GetType(), "stl_samples.clipboard.js"); 
      this.Page.ClientScript.RegisterClientScriptInclude("SharedLocationTaskScripts", scriptLocation); 
Some related reading you might find useful:

No comments:

Post a Comment

Total Pageviews