2014-07-04 5 views
6

Ich arbeite an einem Projekt, das sowohl Asp.Net-Webanwendung und Windows-Dienstanwendung besteht. Diese beiden können ein gemeinsames Projekt verwenden, das ich nur erstellt habe, um Ressourcendateien zu enthalten. Ich wollte die Ressourcendateien außerhalb der Assembly platzieren, damit sie bearbeitet werden können, ohne die gesamte Lösung zu kompilieren, wenn ich sie ändern möchte. Ich suche nach einer Methode und finde hier eine als;C# Lesen Ressource RESX-Datei außerhalb der Assembly wirft MissingManifestResourceException

ASP.NET Resourcemanager to read local .resx

Es funktionierte perfekt auf der Web-Anwendung, aber nach einer Weile sah ich, kann die Windows-Service-Anwendung nicht gelesen, dass die Ressourcen, und ich bekam

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) 

Ich verstehe nicht das Problem, weil ich Projekt funktioniert korrekt und das andere nicht. Das andere seltsame Verhalten ist, dass es funktioniert, wenn ich den Dienst auf meinem Computer mit dem Debuggen starte, um zu sehen, was passiert.

Update: Dies ist der Code, den ich

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

ein Manifest Ressource Lesen wird mit einem Verfahren der 'Assembly' getan: Sie müssen eine Instanz für die Baugruppe mit der Ressource: bitte Ihren Code zeigen, so können wir sehen, welche Baugruppe Sie verwenden. – Richard

+0

Hallo Richard, das Problem steigt, weil ich Assembly nicht verwenden möchte, um Ressourcen zu speichern. Ich habe den 'ResxResourceManager' wie vorgeschlagen unter dem Link, den ich in der Frage angegeben habe, erstellt. Ich überprüfe, ob die Parameter falsch waren, aber Kultur, Verzeichnis und Dateiname sind korrekt angegeben. – ertanergun

+0

Blick auf Hut-Code: Es verwendet Reflexion in seinem Aufruf seiner eigenen Basisklasse Konstruktor * auf sich selbst *. Im besten Fall wird das ein fragiler Code sein (in den vier Jahren, seit die referenzierten A-Updates auf .NET dieses Problem hätten lösen können). Warum rufst du nicht [that ctor] (http://msdn.microsoft.com/en-us/library/e5dsaw4c.aspx) direkt an? Wahrscheinlich lohnt es sich auch, dies in einem kleinen fokussierten Prototyp (zB ohne NHibernate oder UI) zu erledigen. – Richard

Antwort

Verwandte Themen