0

我正在为 2 个客户端开发一个 WinForms 应用程序。客户端之间的区别仅在于品牌:ClientA 获取 LogoA.png。ClientB 获取 LogoB.png。我需要将应用程序作为安装程序和所有可执行文件的 zip 文件发送给他们。

我正在考虑将图像放在不同的资源文件中并将它们编译为附属程序集并在构建服务器上,当我生成 zip 文件和安装程序时,我只包含用于 ClientA 的 ResourceA 和用于 ClientB 的 ResourceB。这是计划,但我以前从未这样做过。

文档说资源文件应该由语言和文化代码标识。我的两个客户都将用英语(en-GB 或 en-US)运行他们的机器。我可以忽略推荐并以客户的名义调用资源。但是它们会被应用程序拾取吗?(假设只有一个资源文件且机器文化与资源文化代码不匹配)。

有没有更好的解决方案?

ps 我知道编译器指令,但它使代码变得笨拙和肮脏。将来,客户可能会在屏幕上显示不同的文本,这是资源的完美案例。

4

2 回答 2

1

您可以将一个用于客户端 A 的另一个资源文件添加到单独的资源文件中,另一个用于客户端 B(ClientA.resx、Clinetb.resx)。然后在 app.config 文件中添加一个配置条目,其中包含要使用的资源的名称。然后你需要创建一个包装类,它将根据配置值为你提供资源,你需要使用动态对象和资源管理器,这里是一个示例代码:

 class Program
    {
        static void Main(string[] args)
        {
            var res = new CompanyAResource();

            var companyResources = new global::System.Resources.ResourceManager("ConsoleApplication1.CompanyAResource", typeof(CompanyAResource).Assembly);

            dynamic resources = new DynamicResources(companyResources);

            string name = resources.CompanyName;

            Console.WriteLine(name);

        }     
    }

    public class DynamicResources : System.Dynamic.DynamicObject
    {
        private ResourceManager resources;

        public DynamicResources(ResourceManager resources)
        {
            this.resources = resources;
        }      

        public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result)
        {
            result = this.resources.GetString(binder.Name);
            return true;
        }      
    }
于 2013-07-12T16:00:00.113 回答
1

您可以为每个公司创建单独的构建配置。然后,您可以更改 .csproj 文件以具有 msbuild 任务,该任务将用选定的公司资源替换默认资源文件,这里是如何检查 msbuild 中的当前配置的示例。

<PropertyGroup Condition="'$(Configuration)' == 'CompanyABuild'">
  //set resource to point to company A
</PropertGroup>
<PropertyGroup Condition="'$(Configuration)' == 'CompanyBBuild'">
    //set resource to point to company B
</PropertGroup>
于 2013-07-12T16:20:20.240 回答