2011-12-26 14 views
14

Scenariusz: Chcę utworzyć złożenia satelitarne, które są złożeniami zasobów. Ten zestaw zawiera tylko skompilowane zasoby (ResourceWriter). Celem jest stworzenie zespołów zasobów poza VS i dodać je do aplikacji, a to w mojej aplikacji C#Tworzenie zespołów zasobów za pomocą AssemblyBuilder

Atm jestem używając AssemblyBuilder do stworzenia zespołu. Działa, ale nie ma informacji o zgromadzonym zestawie. Brak informacji o kulturze, kluczu lub cokolwiek innego. Zestaw nie jest zajęty przez aplikację z wyjątkiem wyjątku dotyczącego wyjątku zasobów ludzkich. :(

Jeśli to możliwe chcę zostać z AssemblyBuilder lub za pomocą CodeDomProvider

Pytanie. Co jest niezbędne, aby móc dodać nowy zespół satelitarną do mojego app Czy wystarczy mieć folder z? kultura (en-US) i zespół z zasobów en-us tam

question2: Czy to możliwe, aby dać pewną meta informacje, takie jak wersja, kultura do zespołu

? Question3: Czy wystarczy, aby dodać zasoby do zespołu?

Kod:

AssemblyBuilder builder = AppDomain.CurrentDomain.DefineDynamicAssembly(
         assemblyName, AssemblyBuilderAccess.RunAndSave, resourceFolder); 

builder.AddResourceFile(name, assemblyFileName); 
builder.Save(assemblyName.Name); 

Dla każdego rodzaju pomoc będę wdzięczny. Z góry dziękuję

Odpowiedz

4

znalazł rozwiązanie.

Źródło: http://www.dotnet247.com/247reference/msgs/58/290731.aspx

Objaśnienie: Po pierwsze Wydaje się AssemblyBuilder odwołuje się tylko zasób do zespołu, to nie jest osadzony. Po drugie zasób musi być widoczny w głównym zespole. (ja lubię do skrzyni źródła w obrębie modułu, ale nie wydaje się być w żaden sposób do wbudowanego już istniejącego zasobu)

Code:

 string myAsmName = "WriteSatelliteAssembly.resources"; 
     string myAsmFileName = myAsmName + ".dll"; 
     string resourceName = "WriteSatelliteAssembly.MyResource2.fr.resources"; 
     string path; 

     path = AppDomain.CurrentDomain.BaseDirectory + "fr-FR"; 
     AppDomain appDomain = Thread.GetDomain(); 
     AssemblyName asmName = new AssemblyName(); 
     asmName.Name = myAsmName; 
     asmName.CodeBase = path; 
     asmName.CultureInfo = new CultureInfo("fr"); 

     AssemblyBuilder myAsmBuilder = appDomain.DefineDynamicAssembly(
      asmName, 
      AssemblyBuilderAccess.RunAndSave, path); 

     **ModuleBuilder** myModuleBuilder = 
      myAsmBuilder.DefineDynamicModule(myAsmFileName, 
      myAsmFileName); 
     **IResourceWriter** rw = 
      myModuleBuilder.DefineResource(resourceName, 
      "My Description",ResourceAttributes.Public); 

     rw.AddResource("resName","My (dynamic) resource value."); 
     rw.AddResource("resName2","My (dynamic) second resource value."); 

     myAsmBuilder.Save(myAsmFileName); 

Dowód shortend:

Związany zasobem zespół

.file nometadata 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
    .hash = (57 DD 82 37 9E B3 BA 8A 27 D0 69 90 37 67 22 23 // W..7....'.i.7g"# 
      A0 1C F7 47)          // ...G 
.mresource public TestProjectResourceManager.Properties.Resources 
{ 
    .file 'TestProjectResourceManager.Properties.Resources.en-US.resources' at 0x00000000 
} 

wbudowany zasób w zespole

.mresource public 'TestProjectResourceManager.Properties.Resources.en-US.resources' 
{ 
    // Offset: 0x00000000 Length: 0x000000EE 
} 
.module TestProjectResourceManager_2.resources.dll 

Baw

+0

Sprawdzę to w wolnym czasie wznawiają twoje wysiłki, aby dzielić się;) –

+0

Możesz także zaakceptować swoją odpowiedź, jeśli uważasz, że tak naprawdę było po tobie. –

2

Będziesz potrzebować następujących narzędzi do tworzenia złożeń.

  1. resgen.exe
  2. al.exe
  3. ildasm.exe

al.exe jest program, który osadza zasoby w zespole satelitarną. Ale al.exe akceptuje tylko zasoby w formacie binarnym .resources. Ale nasze dane wejściowe są zwykle plikami zasobów tekstowych lub plikami zasobów XML w formacie .resx. Plik resgen.exe służy do konwersji tych alternatywnych form zasobów do formatu binarnego .resources, który jest smaczny na al.exe.

ildasm.exe: Jeśli pamiętasz, co robi Visual Studio IDE, zobaczysz, że istnieje translacja nazwy między strukturą katalogu plików zasobów i sposobem, w jaki ten plik zasobów jest znany wewnątrz zespołu. Becaue używamy Visual Studio IDE do generowania domyślnych zasobów i procesu rozszerzenia do generowania zespołów satelitów, oba mechanizmy muszą produkować złoŜenia o tym samym rodzaju hierarchii nazewnictwa dla plików zasobów.

Używamy ildasm do sprawdzenia bibliotek DLL, które generuje IDE Visual Studio, aby dowiedzieć się, jaka jest struktura, i używać tego samego mechanizmu do generowania zestawów satelitarnych. Możesz również zbadać złożenia satelitarne za pomocą ildazmu, aby upewnić się, że nazwy są poprawne. Przydaje się to do usuwania błędów z menedżera zasobów informujących, że nie może zlokalizować zasobu.

Teraz, gdy opisane są narzędzia, w jaki sposób możemy przekonwertować zewnętrzny plik zasobów na zespół satelity? Jak wspomniano poniżej, jest to proces trzech (naprawdę, dwóch) kroków.

Krok 0: Określ ścieżkę do resgen i al.exe:

@set path=%path%; 
    "C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Bin"; 
    c:\winnt\microsoft.NET\framework\v1.0.3705 

Krok 1: Użyj resgen utworzyć plik .resources od A .resx pliku.

Resgen MyText.resx 

Powyższe polecenie utworzy plik o nazwie:

MyText.resources 

Krok 2: Użycie al.exe stworzyć zespół Satelita:

Al.exe 
    /t:lib 
    /embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources 
    /culture:hi-gb 
    /out:MyApplication.resources.dll 

Istnieje kilka rzeczy, które warto tutaj:

/t:lib: Says you are interested in a .dll. 

/embed:MyText.en-gb.Resources,MyApplication.MyText.en-gb.Resources : Embeds and renames the resource to a target name to match the Visual Studio IDE naming structure. 

/culture:hi-gb : Identifies the culture in which you are interested. 

/out:MyApplication.resources.dll : Name of the DLL in which you are interested. 

Wygenerowany plik .dll musi mieć taką konwencję nazewnictwa dla .NET, aby ją znaleźć. Zauważ także, że musisz określić ustawienie kultury, nawet jeśli kultura jest dostępna w nazwach plików zasobów. Tak więc należy o tym wspomnieć w obu miejscach.

Umieść zespół satelitarna w odpowiednim katalogu Po utworzeniu montaż satelitarna, fizycznie skopiować .dll do następującego katalogu:

\MyApplication\bin\en-gb\MyApplication.Resources.DLL 

W przypadku wielu plików zasobów:

\MyApplication\resources\files\CommonResources.resx 
\MyApplication\resources\files\Module1Resources.resx 
\MyApplication\resources\files\Module2Resources.resx 

Można również zdefiniować klucze dla tych zasobów w oddzielnej hierarchii, w następujący sposób:

\MyApplication\resources\keys\CommonKeys.cs 
\MyApplication\resources\keysModule1Keys.cs 
\MyApplication\resources\keys\Module2Keys.cs 

Dla skryptu programu partii, proszę odwołać się do mojego bloga http://samithenerd.blogspot.com/2011/12/batch-program-for-creating-satellite.html

+0

boah thx u bardzo będę studiować ur odpowiedzi, ale szczerze chcę zrobić w moim programie (kod) – Orri

+0

Ok, pozwól mi zobaczyć go i wrócić. – CodeMad

+0

Znalazłem ** źródło ** ur list rzeczy. http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=1 – Orri

Powiązane problemy