2016-11-08 2 views
1

번역기 도구를 단순화하기위한 솔루션을 정교하게하려고합니다. 따라서 현재는 코드 내에서 Satellite 어셈블리를 자동으로 컴파일하려고합니다.코드 내에서 위성 어셈블리를 생성 할 수 있습니까?

그래서 내가 무엇을 실현하려 싶은 것은 다음 명령을 수동으로 실행을 대체하는 것입니다 : 지금까지 내가 일 .dll 파일을 생성, 테스트 한

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

. 하지만 아래와 같이 ressource를 임베딩/링크하는 것은 효과가 없지만 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 
);