是否可以从代码内部生成附属程序集?



我将要阐述一个简化翻译工具的解决方案。因此,我目前尝试从我的代码中自动编译卫星程序集。

所以我想要实现的是替换手动运行以下命令:

AL.exe /culture:de /out:deTestResource.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,其中只包含一种语言的本地化资源,以便它可以用作卫星程序集?

最后,我已经设法从代码生成卫星程序集。

下面的代码生成一个合适的资源文件:

// 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!!");
}

使用这个资源文件,有一些编译器选项是必要的:

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

最后编译程序集有一些必需的代码必须编译成:

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

最新更新