2013-07-12 2 views
0

2 명의 클라이언트에 대해 WinForms 응용 프로그램을 개발 중입니다. 클라이언트 간의 차이점은 브랜딩에만 있습니다. ClientA는 LogoA.png를 얻습니다. ClientB는 LogoB.png를 얻습니다. 설치 프로그램에서와 같이 모든 응용 프로그램을 zip 파일로 보내야합니다.다른 클라이언트 배포를위한 서로 다른 리소스 파일

이미지를 다른 리소스 파일에 넣고 위성 어셈블리로 컴파일하고 서버를 빌드 할 때 Zip 파일과 설치 프로그램을 만들 때 ClientA 용 ResourceA와 ClientB 용 ResourceB 만 포함합니다. 그것이 계획이지만, 나는 전에 이것을 한 적이 없다.

documentation은 리소스 파일이 언어 및 문화 코드로 식별되어야한다고 말합니다. 두 고객 모두 영어 (en-GB 또는 en-US)로 컴퓨터를 운영합니다. 추천을 무시하고 고객의 이름으로 리소스를 호출 할 수 있습니다. 그러나 그들은 신청서에 의해 집어들 것인가? (리소스 파일이 하나 뿐이므로 컴퓨터 문화권이 리소스 문화권 코드와 일치하지 않습니다).

더 나은 솔루션이 있습니까?

p.s. 필자는 컴파일러 지시문에 대해 알고 있지만 코드가 깔끔하고 더러워졌습니다. 앞으로는 클라이언트가 화면에 다른 텍스트를 표시 할 수 있으며 이는 리소스에 대한 완벽한 사례입니다.

답변

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> 
+0

그 문제는 그것이 무엇인지에 대해 너무 많은 시간이 걸렸습니다. 나는 더블 컴파일로 "더러운"길을 걸어 갔다. – trailmax

1

clientA 용 리소스 파일 하나와 clientB 용 클라이언트 파일 (ClientA.resx, Clinetb.resx)을 별도로 추가 할 수 있습니다. 그런 다음 app.config 파일에 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; 
     }  
    } 
+0

나는 그것에 대해 생각했다. 이는 내가 피하고 싶은 다른 클라이언트 구성을 배치하는 것과 관련이 있습니다. 또한 사용자는 app.config를 변경하고 다른 브랜딩을 사용할 수 있습니다. – trailmax

+0

우리의 앱으로 모든 리소스를 보내지 않으려면 각 회사마다 별도의 빌드가 있어야합니다. 응용 프로그램을 빌드하기 전에 당신이 구축하려는 회사의 리소스 파일을 대체 할 수 있습니다. 예를 들어, msbuild 작업을 사용하여 프로세스를 자동화 할 수 있습니다. –

+0

그것은 또한 내 마음에 들었습니다. 그러나 이것은 연속 배송의 "Build Once"규칙에 위배됩니다. 설치자를 만들기 전에 다른 모든 어셈블리와 동시에 모든 리소스를 빌드하고 마지막 단계로 추가 리소스를 제거하는 것이 좋습니다. – trailmax

관련 문제