2014-07-04 17 views
6

Sto lavorando a un progetto che consiste sia di un'applicazione Web Asp.Net sia di un'applicazione di servizio Windows. Questi due possono usare un progetto comune che ho creato solo per contenere i file di risorse. Volevo mettere i file di risorse all'esterno del gruppo, quindi quando voglio cambiarli, potrebbero essere modificabili senza compilare tutte le soluzioni. Cerco un metodo e trovo qui uno come;C# Risorsa di lettura file .resx all'esterno dell'assieme genera MissingManifestResourceException

ASP.NET Resourcemanager to read local .resx

ha funzionato perfettamente sul web application, ma dopo un po 'che ho visto, l'applicazione di servizio Windows non può leggere che le risorse ed ho ottenuto

System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture (or the neutral culture) on disk. 
baseName: abc locationInfo: <null> fileName: abc.resx 
    at System.Resources.FileBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 
    at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture, Boolean wrapUnmanagedMemStream) 
    at System.Resources.ResourceManager.GetObject(String name, CultureInfo culture) 
    at yyyy.yyyyyy.yyyyyyy.GetGlobalResourceObject(String classKey, String resourceKey, Boolean getCommon) 
    at xxx.xxx.xxx.Entities.xxxxxxxx.get_LocalizedName() 
    at yyyyy.Adapters.ArchiverDtoAdapter.CreateArchiverInjectionsDto(InjectionProcedure procedure, INamingService namingService) 
    at yyyyy.Adapters.ArchiverDtoAdapter.ConvertInjectionProcedureDto(InjectionProcedure procedure, INamingService namingService) 
    at yyyy.Factories.ArchiverDtoFactory.<>c__DisplayClass1.<CreateInjectionProcedureSendRequestDto>b__0(IUnitOfWork unitOfWork) 
    at Core.Data.NHibernate.Factory.UnitOfWorkFactoryBase.Create(Action`1 action, IUnitOfWork unitOfWork) 
    at Core.Data.NHibernate.Factory.UnitOfWorkFactory.Create(Action`1 action) 

Non capisco il problema perché, mi il progetto funziona correttamente e l'altro no. L'altro strano comportamento è che quando avvio il servizio sulla mia macchina con il debug per vedere cosa succede, funziona.

Aggiornamento: Questo è il codice che sto usando come riferimento

public class ResxResourceManager : ResourceManager 
    { 
     public ResxResourceManager(string baseName, string resourceDir) 
     { 
      ObjectFactory.ResolveDependencies(this); 

      Type[] paramTypes = new Type[] { typeof(string), typeof(string), typeof(Type) }; 
      object[] paramValues = new object[] { baseName, resourceDir, typeof(ResXResourceSet) }; 

      Type baseType = GetType().BaseType; 

      ConstructorInfo ci = baseType.GetConstructor(
       BindingFlags.Instance | BindingFlags.NonPublic, 
       null, paramTypes, null); 

      ci.Invoke(this, paramValues); 
     } 

     protected override string GetResourceFileName(CultureInfo culture) 
     { 
      string resourceFileName = base.GetResourceFileName(culture); 
      return resourceFileName.Replace(".resources", ".resx"); 
     } 
    } 
+0

La lettura di un risorsa del manifesto è fatto con un metodo di 'Assembly': avete bisogno di un'istanza per il montaggio che contiene la risorsa: si prega di mostrare il codice in modo che possiamo vedere che il montaggio si sta utilizzando. – Richard

+0

Ciao Richard, il problema sorge perché non voglio utilizzare l'assembly per archiviare le risorse. Ho creato il 'ResxResourceManager' come suggerito al link che ho dato nella domanda. Controllo se i parametri sono sbagliati ma cultura, directory e nome file sono tutti dati correttamente. – ertanergun

+0

Guardando il codice hat: sta usando reflection nella sua chiamata proprio costruttore della classe base * su se stesso *. Nel migliore dei casi questo sarà un codice fragile (nei quattro anni successivi al riferimento A gli aggiornamenti di .NET potrebbero averlo rotto). Perché non chiamare semplicemente [quel ctor] (http://msdn.microsoft.com/en-us/library/e5dsaw4c.aspx) direttamente? Probabilmente vale anche la pena farlo funzionare in un piccolo prototipo focalizzato (ad esempio, nessun NHibernate o UI). – Richard

risposta