C# 不同客户端部署的不同资源文件

C# 不同客户端部署的不同资源文件,c#,winforms,deployment,resources,C#,Winforms,Deployment,Resources,我正在为两个客户端开发一个WinForms应用程序。客户端之间的区别仅在于品牌:ClientA获得LogoA.png。ClientB获取LogoB.png。我需要将应用程序作为安装程序和zip文件以及所有可执行文件发送给他们 我正在考虑将图像放在不同的资源文件中,并将它们编译为附属程序集,然后在构建服务器上,当我生成zip文件和安装程序时,我只包含ResourceA for ClientA和ResourceB for ClientB。这是计划,但我以前从未这样做过 报告说,资源文件应该通过语言和

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

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

报告说,资源文件应该通过语言和文化代码来识别。我的两个客户都将用英语(en GB或en US)运行他们的机器。我可以忽略这个建议,用客户的名字来调用资源。但是他们会被应用程序接受吗?(假设只有一个资源文件,且计算机区域性与资源区域性代码不匹配)

有更好的解决办法吗


p、 我知道编译器指令,但这会使代码变得粗糙和肮脏。将来,客户端可能会在屏幕上显示不同的文本,这是资源的最佳情况。

您可以在单独的资源文件中添加一个用于clientA,另一个用于clientB(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;
        }      
    }

您可以为每个公司创建单独的生成配置。然后您可以将.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>

//将资源设置为指向公司A
//将资源设置为指向公司B

我考虑过了。这将涉及部署不同的客户端配置,我希望避免这种情况。此外,这将允许用户更改app.config并使用其他品牌。如果您不想随我们的应用程序一起提供所有资源,则需要为每个公司单独构建。在构建应用程序之前,您可以为正在构建的公司替换资源文件,例如,您可以使用msbuild任务来自动化我想到的流程。但这将违反连续交付的“一次构建”规则。在创建安装程序之前,我宁愿在创建所有其他程序集的同时构建所有资源,并将删除额外资源作为最后一步。无论如何,感谢您对配置的建议。我想我将使用资源创建程序集,并将它们与主应用程序同时构建。然后通过reflection:scan app folder加载具有资源的程序集。取一个可用的并从那里加载图像。这个问题花费了太多的时间。我走上了双重编译的“肮脏”道路。