Results for tag "embedded-resource"

Javascript als Resource verpacken/entpacken (Arbeiten mit Embedded Resources)

In meinen Utils-Bibliotheken, habe ich einige WebControls, welche auf div. Javascript-Bibliotheken zugreifen. Unter anderem z.B. jQuery oder jQueryUI aber eben auch selbst geschnitzte Bibliotheken.

Nachdem es bei Projektstart immer recht mühsam ist, die Files zusammenzutragen, habe ich mir überlegt, diese als Resource meinen Utils hinzuzufügen und zur Laufzeit zu entpacken und registrieren.

Zunächst fügt man die benötigten Files dem Projekt hinzu. Wichtig ist es, dass man in den Eigenschaften des Files die Option „Build Action -> Embedded Resource“ einstellt. Nur damit wird das File in der DLL verpackt! Die Größe der DLL vergrößert sich dadurch natürlich. Man sollte daher abwiegen, welche Resourcen man wirklich auf diesem Wege hinzufügen will.

Um die verpackten Resourcen nun zur Laufzeit zu entpacken, habe ich in meiner PageBase (Ableitung von Page, verwende ich in den Code-Behinds statt Page) einen Event hinzugefügt (im Page_Load()-Event), welcher eine entsprechende Funktion aufruft. Nachfolgend der Sourcecode:

[sourcecode language=“csharp“]
private static string _fnJquery = String.Empty;
/// <summary>
/// Gets the fn cookie.
/// </summary>
/// <value>The fn cookie.</value>
public static string fnJquery
{
get
{
if (string.IsNullOrEmpty(_fnJquery))
return ConfigUtils.ReadStringFromAppSettings("BasicLib_FileName_JqueryScript", "jquery-1.4.1.js");
else
return _fnJquery;
}
set
{
_fnJquery = value;
}
}
/// <summary>
/// Gets a value indicating whether this instance is basic lib enabled.
/// </summary>
/// <value>
/// <c>true</c> if this instance is basic lib enabled; otherwise, <c>false</c>.
/// </value>
public static bool IsBasicLibEnabled
{

get {
if(System.Web.HttpContext.Current.Session["BasicLib_Enabled"] == null)
return ConfigUtils.ReadBoolFromAppSettings("BasicLib_Enabled", false);
else
{
return Convert.ToBoolean(System.Web.HttpContext.Current.Session["BasicLib_Enabled"].ToString());
}
}
set
{
System.Web.HttpContext.Current.Session.Add("BasicLib_Enabled", value);
}
}

/// <summary>
/// Registers the basic lib.
/// </summary>
/// <param name="p">The p.</param>
public static void RegisterBasicLib(Page p)
{
if (IsBasicLibEnabled)
{
// write resources to stream
if (!System.IO.File.Exists(StringUtils.AddSlashIfNeeded(ClientScriptFilePath) + fnJquery))
{
ExtractAndSaveResource();
}

// register script
if (!p.ClientScript.IsClientScriptIncludeRegistered(fnJquery))
p.ClientScript.RegisterClientScriptInclude(fnJquery,
StringUtils.AddSlashIfNeeded(ClientScriptFilePath) +
fnJquery);

}

}

/// <summary>
/// Extracts the and save resource.
/// </summary>
public static void ExtractAndSaveResource()
{
if (IsBasicLibEnabled)
{
const string nameSpace = "Utils.Web.Javascript.BasicLib.Resources";

Stream sJquery = ResourceUtils.LoadResourceFromExecutingAssembly(nameSpace, fnJquery,
ResourceUtils.TargetAssembly.
ExecutingAssembly);
// save streams
string absClientScriptFilePath = System.Web.HttpContext.Current.Server.MapPath(ClientScriptFilePath);

FileUtils.SaveContentToFile(fnJquery, absClientScriptFilePath, sJquery);
}
}
[/sourcecode]

Achtung! Es muss unbedingt der genaue Namespace verwendet werden!! Ansonsten wird die Resource nicht gefunden und eine Exception geworfen.
Das Ergebnis sieht wie folgt aus und lässt keinen Unterschied zum „normalen“ hinzufügen einer JS-Datei erkennen:

Viel Spaß!