2016-11-08 17 views
1

私は、トランスレータツールを簡略化するための解決策を模索しようとしています。したがって、私は現在、自分のコード内からSatelliteアセンブリを自動的にコンパイルしようとしています。コード内から衛星アセンブリを生成することは可能ですか?

それでは、私はachiveたいのは、次のコマンドを手動で実行を置き換えることです:

AL.exe /culture:de /out:de\TestResource.resources.dll /embed:TestResource.de.resources

これまでのところ、私が働いていた.dllファイルを生成するテストしてみました。しかし、以下に示すようなリソースを埋め込み/リンクしても効果はありませんが、DLLのサイズは大きくなります。だから明らかにそこにはありますが、結果として得られるdllが衛星アセンブリであるかのようには使えません。

static void Main(string[] args) 
    { 
     CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
     CompilerParameters parameters = new CompilerParameters(); 

     parameters.GenerateExecutable = false; 
     parameters.OutputAssembly = "./output/satellite_test.dll"; 
     parameters.EmbeddedResources.Add(@"./TestResource.en.resources"); 
     parameters.LinkedResources.Add(@"./TestResource.de.resources"); 

     CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, ""); 
    } 

それはサテライトアセンブリとして使用可能だように、一つの言語のためだけにローカライズされたリソースを含むDLL、プログラムを生成する方法は、ありますか?

答えて

1

最後に私はコードから衛星アセンブリを生成することができました。

CompilerParameters parameters = new CompilerParameters(); 

// Newly created assembly has to be a dll. 
parameters.GenerateExecutable = false; 

// Filename has to be like the original resourcename. Renaming afterwards does not work. 
parameters.OutputAssembly = "./de/TranslationTest.resources.dll"; 

// Resourcefile has to be embedded in the new assembly. 
parameters.EmbeddedResources.Add(resourcefileName); 

最後にコンパイルされなければならないいくつかの必要なコードがあるアセンブリをコンパイル:必要ないくつかのcompileroptionsがあり、このresourcefileもを使用

// Already the resourcefilename has to match the 
// exact namespacepath of the original resourcename. 
var resourcefileName = @"TranslationTest.Resources.TestResource.de.resources"; 

// File has to be a .resource file. (ResourceWriter instead of ResXResourceWriter) 
// .resx not working and has to be converted into .resource file. 
using (var resourceWriter = new ResourceWriter(resourcefileName)) 
{ 
    resourceWriter.AddResource("testtext", "Language is german!!"); 
} 

:次のコード

適切なresourcefileもを生成します入力:

// Culture information has to be part of the newly created assembly. 
var assemblyAttributesAsCode = @" 
    using System.Reflection; 
    [assembly: AssemblyCulture(""de"")]"; 

CSharpCodeProvider codeProvider = new CSharpCodeProvider(); 
CompilerResults results = codeProvider.CompileAssemblyFromSource(
    parameters, 
    assemblyAttributesAsCode 
); 
関連する問題