2011-12-26 26 views
14

Kịch bản: Tôi muốn tạo các hội đồng vệ tinh là các hội đồng tài nguyên. Hội đồng này chỉ biên dịch tài nguyên trong đó (ResourceWriter). Mục tiêu là tạo các assembly tài nguyên bên ngoài VS và thêm chúng vào ứng dụng và trong ứng dụng C#Xây dựng các hội đồng tài nguyên với AssemblyBuilder

Atm Tôi đang sử dụng AssemblyBuilder để tạo Assembly. Nó hoạt động nhưng không có thông tin về lắp ráp được lưu trữ. Không có cultureinfo, key hay bất cứ thứ gì khác. Việc lắp ráp không được thực hiện bởi ứng dụng với một Thiếu ngoại lệ tài nguyên Manfifest. :(

Nếu có thể tôi muốn ở lại với AssemblyBuilder hoặc sử dụng CodeDomProvider

Câu hỏi:. Là gì cần thiết để có thể thêm lắp ráp vệ tinh mới để ứng dụng của tôi là nó đủ để có một thư mục với? văn hóa (en-US) và một hội đồng với các nguồn lực en-US trong đó

question2: có thể đưa ra một số thông tin meta như bản, văn hóa để lắp ráp các

? Question3: Có đủ để thêm các nguồn lực vào lắp ráp không?

Code:

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

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

Đối với bất kỳ loại giúp đỡ tôi sẽ biết ơn. Cảm ơn trước

Trả lời

4

Tìm thấy giải pháp.

Nguồn: http://www.dotnet247.com/247reference/msgs/58/290731.aspx

Giải thích: Đầu tiên Có vẻ như AssemblyBuilder chỉ liên kết các nguồn lực để lắp ráp, nó không được nhúng. Thứ hai, tài nguyên phải ở trong số Mô-đun để được hội đồng chính nhìn thấy. (Tôi không thích để thùng các tài nguyên trong module nhưng có vẻ là không có cách nào để nhúng tài nguyên đã tồn tại)

Bộ luật:

 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); 

rút ngắn đáng Proof:

liên kết tài nguyên trong lắp ráp

.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 
} 

nhúng tài nguyên trong assembly

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

Have fun

+0

Tôi sẽ kiểm tra trong thời gian rảnh, upvoted nỗ lực của bạn để chia sẻ;) –

+0

Ngoài ra bạn có thể chấp nhận câu trả lời của bạn là tốt nếu bạn nghĩ rằng đây là những gì bạn đã thực sự sau. –

2

Bạn sẽ cần các công cụ sau để tạo hội đồng.

  1. resgen.exe
  2. al.exe
  3. Ildasm.exe

al.exe là chương trình nhúng nguồn lực vào một lắp ráp vệ tinh. Nhưng al.exe sẽ chỉ chấp nhận tài nguyên ở định dạng nhị phân .resources. Nhưng đầu vào của chúng tôi thường là tệp tài nguyên văn bản thuần túy hoặc tệp tài nguyên dựa trên XML ở định dạng .resx. resgen.exe được sử dụng để chuyển đổi các dạng tài nguyên thay thế này thành định dạng nhị phân .resources có thể thích thú với al.exe.

ildasm.exe: Nếu bạn nhớ Visual Studio IDE đang làm gì, bạn sẽ thấy rằng có một bản dịch tên giữa cấu trúc thư mục tệp tài nguyên của bạn và cách tệp tài nguyên đó được biết bên trong assembly. Becaue chúng ta đang sử dụng Visual Studio IDE để tạo các tài nguyên mặc định và quá trình mở rộng để tạo ra các hội đồng vệ tinh, cả hai cơ chế phải tạo ra các assembly với cùng một loại phân cấp đặt tên cho các tệp tài nguyên.

Vì vậy, chúng tôi sử dụng ildasm để kiểm tra các DLL mà Visual Studio IDE tạo ra để tìm hiểu cấu trúc là gì và sử dụng cùng một cơ chế để tạo các cụm vệ tinh. Bạn cũng có thể kiểm tra các hội đồng vệ tinh sử dụng ildasm để đảm bảo rằng bạn có được tên đúng. Điều này sẽ hữu ích cho việc gỡ lỗi từ trình quản lý tài nguyên cho bạn biết rằng nó không thể định vị một tài nguyên.

Bây giờ các công cụ được vạch ra, làm cách nào để chuyển đổi tệp tài nguyên bên ngoài thành một cụm vệ tinh? Như đã lưu ý dưới đây, đây là một quá trình ba bước (thực sự, hai).

Bước 0: Đặt đường dẫn của bạn cho resgen và al.exe:

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

Bước 1: Sử dụng resgen để tạo ra một tập tin .resources từ một file resx.

Resgen MyText.resx 

Lệnh trên sẽ tạo ra một tập tin gọi là:

MyText.resources 

Bước 2: Sử dụng al.exe để tạo lắp ráp vệ tinh:

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

Có một vài điều đáng lưu ý ở đây:

/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. 

Dll được tạo ra phải có quy ước đặt tên cho .NET để tìm nó. Cũng lưu ý rằng bạn phải chỉ định cài đặt văn hóa, mặc dù văn hóa có sẵn trong tên của các tệp tài nguyên. Vì vậy, nó đã được đề cập ở cả hai nơi.

Đặt hội vệ tinh trong phù hợp mục Khi lắp ráp vệ tinh được tạo ra, chất copy .dll vào thư mục sau:

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

Trong trường hợp nhiều file nguồn:

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

Và bạn có thể xác định các khóa cho các tài nguyên này trong một hệ thống phân cấp riêng biệt, như sau:

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

Đối với một kịch bản chương trình lô, vui lòng tham khảo blog của tôi http://samithenerd.blogspot.com/2011/12/batch-program-for-creating-satellite.html

+0

boah thx u rất nhiều tôi sẽ nghiên cứu trả lời ur nhưng phải thẳng thắn tôi muốn làm điều đó trong chương trình của tôi (code) – Orri

+0

Ok, hãy để tôi nhìn thấy nó và trở lại. – CodeMad

+0

Tôi đã tìm thấy ** nguồn ** của danh sách ur đồng. http://ondotnet.com/pub/a/dotnet/2002/10/14/local2.htm?page=1 – Orri

Các vấn đề liên quan