Caricare un file javascript embedded da una libreria in un progetto ASP.NET MVC

Appunto qui per ricordarmene in futuro visto che ultimamente dimentico tutto: ho realizzato una libreria di classi in cui, oltre ad oggetti C#, sono presenti diversi file javascript il cui contenuto è necessario perché le classi possano funzionare correttamente. Per caricarli all’interno del progetto principale è necessario:

  1. selezionare il file javascript presente nel progetto libreria;
  2. dal menu contestuale (click destro del mouse), selezionare la voce Proprietà;
  3. nella finestra che compare modificare Build Action: Embedded Resource.
  4. nel file AssemblyInfo.cs della del progetto libreria aggiungere una nuova riga di codice:
[assembly:System.Web.UI.WebResource(
  "YourNamespace.Resource.js", 
  "application/x-javascript"
)]

A questo punto possiamo caricare il file javascript utilizzando ClientScript.GetWebResourceUrl(Type, resourceName).
Utilizzando ASP.NET MVC è necessario un ulteriore passaggio perché tutto funzioni correttamente: realizzare una classe che ci consenta di reperire direttamente l’URL del file javascript da poter includere nella nostra pagina web:

public static class ResLocator
{
  private const string UrlLocatorMethodName = "GetWebResourceUrlInternal";
  public static string Resolve(Type assemblyObjectType, string resourceName) 
  {
    MethodInfo resourceLocatorMethod = assemblyObjectType.GetMethod(UrlLocatorMethodName, 
    BindingFlags.NonPublic | BindingFlags.Static);
    string url = string.Format("/{0}", resourceLocatorMethod.Invoke(
      null,
      new object[] { Assembly.GetAssembly(assemblyObjectType), resourcePath, false })
    );
    return url;
  }
}

Il metodo Resolve accetta in input un Type che deve necessariamente riferirsi ad un tipo di oggetto contenuto nel progetto libreria e resourceName, cioè il nome della risorsa da includere. Successivamente, referenziando il namespace in cui è contenuto l’helper all’interno della nostra MasterPage, è possibile includere lo script di riferimento in questo modo:

<script 
  type="text/javascript" 
  src="@ResLocator.Resolve(typeof(SampleAssemblyObject), "YourNamespace.Resource.js)" />

Completati questi passaggi è possibile avviare l’app MVC e ottenere un URL simile al seguente:

/WebResource.axd?d=HWyLh7g77XD...Z81&t=634788092174760080

Formato vecchio o libreria di tipo non valido con PIAs

Un problema che si potrebbe incontrare durante l’utilizzo di oggetti Microsoft.Interop.Office.Excel e l’impossibilità di poter esportare file, blocco dovuto ad un particolare messaggio di errore:

Formato vecchio o libreria di tipo non valido. (Exception from HRESULT: 0×80028018 (TYPE_E_INVDATAREAD)).

Questo errore, all’interno di applicazioni web, è dovuto ad una differenza di Cultura tra la versione di Microsoft Office installata sul server (differente appunto da quella del web server stesso). La soluzione al problema è molto semplice, durante l’esecuzione di operazioni che richiamano oggetti Excel è necessario cambiare, sul web server, il contesto di esecuzione, impostando una cultura (definita principalmente dalla lingua stessa) uguale a quella della versione di Microsoft Office installata.

Per prima cosa apriamo il file web.config, posizioniamoci nella sezione appSettings e scriviamo:

<add key="CultureInfo" value="it-IT" />

Successivamente realizziamo una semplice classe che ci consente di applicare uno switch, istantaneamente, sulla lingua del Thread in esecuzione:

public class MsCultureSwitch : IDisposable
{
  public static string CultureInfoName
  {
      get { return ConfigurationManager.AppSettings["CultureInfo"]; }
  }
  
  private CultureInfo originalCulture = null;

  public MsCultureSwitch()
  {
    originalCulture = Thread.CurrentThread.CurrentCulture;
    Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureInfoName);
  }

  public void Dispose()
  {
    Thread.CurrentThread.CurrentCulture = originalCulture;
  }
}

Infine possiamo utilizzare l’oggetto appena creato per eseguire codice con la libreria PIAs:

using(MsCultureSwitch msCulture = new MsCultureSwitch())
{
  // Here your PIAs Code!
}

Finito! Spero possa tornare utile anche a voi!