我正在为2个客户开发WinForms应用程序。客户之间的区别仅在于品牌推广:ClientA获得LogoA.png。 ClientB获得LogoB.png。我需要像安装程序一样将应用程序发送给它们,并将zip文件与所有可执行文件一起发送给它
我正在考虑将图像放在不同的资源文件中并将它们编译为附属程序集并在构建服务器上,当我生成zip文件和安装程序时,我只包含ResourceA for ClientA和ResourceB for ClientB。这是计划,但我以前从未这样做过。
documentation表示资源文件应由语言和文化代码识别。我的两个客户都将使用英语(en-GB或en-US)运行他们的机器。我可以忽略该建议,并通过客户名称调用资源。但他们会被应用程序接收吗? (只有一个资源文件和机器文化与资源文化代码不匹配)。
有更好的解决方案吗?
P.S。我知道编译器指令,但它使代码变得笨拙和肮脏。可能在未来,客户将在屏幕上显示不同的文本,这是资源的完美案例。
答案 0 :(得分:1)
您可以为clientB添加单独的资源文件一,为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;
}
}
答案 1 :(得分: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>