[C#] Build Auto Update C# 2015. 8. 7. 10:16

AssemblyInfo에 있는 Version을 자동으로 바꾸게 될 일이 생겼다.

 

보통 AssemblyVersion("0.0.0.*") 으로 처리 하면 자동적으로 시간에 비례하여 업데이트가 되지만

 

일정한 카운터가 올라가지는 않는 것을 발견..

 

여기저기 참고를 하다가 다음과 같이 처리를 했다.

 

일단 AssemblyVesion.tt 라는 파일을 만들고

 


<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>

<#
int major = 0;
int minor = 0;
string build = "0";
string revision = "0";
string Assem = string.Empty;

string error = "";

try
{
    StreamReader reader = new StreamReader(Host.ResolvePath("version.snk"));
    revision = reader.ReadLine().Trim();
    revision = (int.Parse(revision.Trim()) + 1).ToString();
    reader.Close();
    StreamWriter writer = new StreamWriter(Host.ResolvePath("version.snk"), false);
    writer.WriteLine(revision);
    writer.Flush();
    writer.Close();
}
catch (Exception e)
{
 error = e.ToString();
 major = 9999;
 major = 9999;
    build = "9999";
 revision = "9999";
}
#>

using System.Reflection;
[assembly: AssemblyVersion("<#= major #>.<#= minor #>.<#= build #>.<#= revision #>")]
[assembly: AssemblyFileVersion("<#= major #>.<#= minor #>.<#= build #>.<#= revision #>")]

와 같이 코드를 넣었다.

 

내부적으로 카운터를 기록하기 위해서 version.snk 파일을 만들어 카운터 방안으로 삼아두고..

 

저 내부적 내용은 작성자마다 다르게 하면 되니.. 크게 신경 쓸 것은 없다.

 

그리고 빌드 이벤트에 아래와 같이 작성한다.

 

set textTemplatingPath="%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
if %textTemplatingPath%=="\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe" set textTemplatingPath="%CommonProgramFiles%\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\texttransform.exe"
%textTemplatingPath% "$(ProjectDir)\Properties\AssemblyVersion.tt"

 

자.. 여기까지 되었다면.. 빌드하고자 하는 프로젝트를 정리하고 빌드를 한다. 그렇게 하면 자동 업데이트가 되어

 

수정되는 빌드 버전을 확인 할 수가 있을 것이다.

 

단 정리 <<< 를 해 줘야한다. 왜냐면 T4 디버그를 적용해야 하는 듯 하다.

 

tt 파일에서 ctrl + s를 하면 카운터가 변하는 것을확인 할 수 있는데 매번 빌드 할 때 그러기는 그렇고..

 

이래 저래 혼자 만지다 보니 정리하고 난 다음 빌드 하니 바뀌는 것을 확인 할 수가 있었다.

 

안해본거 조금씩 조금씩 한두개 손을 대보게 되네.. 흠냐..

 

나쁘진 않아..

[C#] 작업 스케줄러 등록 C# 2015. 7. 28. 18:14

정말 오랜만에 포스팅을 한번 해 보는듯..

 

윈도우 관리자 권한 덕분에.. 뜨는 팝업창 -_-..

 

싫다.. 그래서 윈도우 시작하면 프로그램 실행 하면 자동으로 실행되게..

 

윈도우 사마께서 알아서 실행되게 해 주는...

 

근데 이게 또 안에 설정을 따라 바꿔야하니까 엄청 짜증난다.

 

근데 4.5에서 Task TaskScheduler 이분이 날 구원하셨으니..(4.0에서도 됩니다.)

 

코드 플렉스에 가보면 아래와 같은 파일이 존재한다.

 

처음에 COM+가 없어서 정말 고민하다가..

 

여기 저기 다 뒤져보니 떡하니 존재하는 아름다운 자식 ㅠㅠ

 

Microsoft.Win32.TaskScheduler.dll

 

뭐 무튼 이놈을 참조하고!!

 

using (TaskService taskService = new TaskService())
            {
                TaskDefinition taskDefinition = taskService.NewTask();

                //일반
                taskDefinition.Principal.DisplayName = "이름";
                taskDefinition.RegistrationInfo.Description = "설명";               
                LogonTrigger login = new LogonTrigger();
                taskDefinition.Principal.UserId = string.Concat(Environment.UserDomainName, "\\", Environment.UserName);
                taskDefinition.Principal.LogonType = TaskLogonType.InteractiveToken;
                taskDefinition.Principal.RunLevel = TaskRunLevel.Highest;
                taskDefinition.Triggers.Add(login);

                //조건
                taskDefinition.Settings.MultipleInstances = TaskInstancesPolicy.IgnoreNew;
                taskDefinition.Settings.DisallowStartIfOnBatteries = false;
                taskDefinition.Settings.StopIfGoingOnBatteries = false;
                taskDefinition.Settings.AllowHardTerminate = false;
                taskDefinition.Settings.StartWhenAvailable = false;
                taskDefinition.Settings.RunOnlyIfNetworkAvailable = false;
                taskDefinition.Settings.IdleSettings.StopOnIdleEnd = false;  
                taskDefinition.Settings.IdleSettings.RestartOnIdle = false;
               
                //설정
                taskDefinition.Settings.AllowDemandStart = false;
                taskDefinition.Settings.Enabled = true;
                taskDefinition.Settings.Hidden = false;
                taskDefinition.Settings.RunOnlyIfIdle = false;
                taskDefinition.Settings.ExecutionTimeLimit = TimeSpan.Zero;
                taskDefinition.Settings.Priority = System.Diagnostics.ProcessPriorityClass.High;

                // 동작
                taskDefinition.Actions.Add(new ExecAction(@"실행파일경로"));

                // 등록
                taskService.RootFolder.RegisterTaskDefinition("스케줄러 표시명", taskDefinition);

            }

 

요런 코드를 넣어주면 들어간다.

 

만약 설정 내부 값이 잘못되면 등록에서 권한 문제 등을 일으키니까 정말 조심해야한다.

 

하나씩 코멘트를 달고 싶지만.. 각자가 알아서 하기!!

 

XML 추출은 작업 스케쥴러에서 내보내기 선택하면... 해당하는 내용을 볼 수가 있다.

 

그러면 각기 Setting에 대한 Element들을 통해서 원하는 방식으로 바꿔서 해 주면 된다.

 

4.5 관련해서 책을 잘 안봤더니...

 

하긴 책에도 이런건 없었던듯..

 

무튼 간만에 포스팅.. 삽질 끝!!

[C#] 다국어 지원 C# 2015. 4. 6. 17:29

다국어 지원이 생각보다 편하다.

 

ko-KR, en-US 이렇게 직접적으로 할 필요가 없이

 

CultureInfo를 이용하여 CurrentCulture를 String 형태로 반환하면 현재 플랫폼의 상황을 알 수가 있다.

 

여지껏 한번도 이렇게 해 본 적이 없고.. 다국어 지원을 처음하다보니 생소하긴한데..

 

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(CultureInfo.CurrentCulture.ToString());
            ResourceManager manager = new ResourceManager("FMAClient.TextInfo", typeof(Form).Assembly);

 

형태로 하면 현재 지정된 리소스를 들고 올 수가 있다.

 

리소스.지원언어 형태로 해서 리소스를 추가 하면 위에서 찾은 지원 형태에 따라 자동으로 인식한다.

 

하나 주의점이 필요하다면.. 기본적인 리소스 파일을 Dummy 형태로 만들어 둬야한다.

 

그렇지 않을 경우 디자이너가 깨지거나 하는 경우를 볼 수가 있다.

 

지원하지 않은 언어에 대한 오류 메세지들이 등장한다.

 

manager.GetString("Conditions"); 형태로 해 주면 리소스에 저장한 이름의 데이터를 가져 올 수가 있다.

 

만약 한국어라면 ko-KR인데 생성 리소스 파일은 리소스명.ko-KR 이렇게 만들어 주면 자동으로 들어간다.

 

영어나 이런 경우 en-US인데 리소스명.en-US 파일을 만들어 두 리소스 파일을 비교 후 해당하는 리소스를 참조하는 형식이다.

 

참조해야하는 네임스페이스는 Resources, Globalization 이 두가지이다.