George Shepherd의 Windows Forms FAQ 번안 – 배포 (Deployment)

원본: http://www.syncfusion.com/FAQ/windowsforms/faq_c40c.aspx#q694q


 


Windows Forms 관련 프로젝트를 진행하던 중, 근래에 보기 드문 자료 모음을 하나 발견하였습니다. Windows Forms, ASP .NET, Silverlight 등 다양한 소프트웨어 컴포넌트를 개발하는 Syncfusion社의 직원으로 근무하면서 받은 여러 질문과 경험 들을 George Shephered님 께서 FAQ의 형태로 웹 페이지로 정리한 페이지입니다.


 


(http://www.syncfusion.com/faq/windowsforms/default.aspx) ASP.NET과 WPF FAQ도 같이 수록되어있으며, 이 중에서 Windows Forms에 대한 부분을 먼저 번안해서 올려보고자 합니다. 번역은 지속적으로 업데이트를 해나가도록 할 예정이며, 잘못 번역된 부분이나 의미가 모호한 부분에 대한 피드백을 주시면 감사하겠습니다. 또한, 최신 버전의 Windows Forms 기술에 대한 피드백도 덧붙여주시면 반영할 수 있도록 하겠습니다. (번역 과정에서 반영하지 못한 내용도 있을 수 있습니다.)


1.1 내 응용프로그램에서 EXE 파일을 어떻게 실행합니까?


System.Diagnostics 네임스페이스의 Process 클래스를 사용하면 됩니다.


 


[C#]


     Process proc = new Process();


     proc.StartInfo.FileName = @”Notepad.exe”;


     proc.StartInfo.Arguments = “”;


     proc.Start();


 


[VB.NET]


     Dim proc As New Process()


     proc.StartInfo.FileName = “Notepad.exe”


     proc.StartInfo.Arguments = “”


     proc.Start()


1.2. 게시자 정책 파일을 활용하면서 발생할 수 있는 문제점은 어떤 것들이 있습니까?


1) 게시자 정책 어셈블리의 이름을 정확히 지정해야만 합니다. 예를 들어, 원본 어셈블리 파일의 이름이 “TestAssebmly.dll” 이라고 가정하였을 때, 게시자 정책 어셈블리 파일의 이름은 “policy.1.0.TestAssembly.dll” 이라고 지정되어야 하며, 이는 “1.0.*” 버전 전체에 대한 어셈블리 리디렉션을 뜻하게 됩니다.


 


2) 게시자 정책 파일 내에서 어셈블리를 지칭할 때에는 어셈블리 이름에 확장자인 DLL을 붙이지 않도록 유의합니다.


다음은 잘못된 예입니다:



<assemblyIdentity name=”TestAssembly.dll” publicKeyToken=”f638d0a8d5996dd4″ culture=”neutral” />


대신 이와 같이 지정하십시오.



<assemblyIdentity name=”TestAssembly” publicKeyToken=”f638d0a8d5996dd4″ culture=”neutral” />


3) 원본 어셈블리 파일 이름에 사용하였던 강력한 이름을 그대로 게시자 정책 어셈블리에도 지정해야 합니다.


 


4) 게시자 정책 파일을 게시자 정책 어셈블리에 맞추어 배포해야 합니다. 게시자 정책 어셈블리만을 게시자 정책 파일 없이 전역 어셈블리 캐시에 단독으로 설치하는 것으로는 충분하지 않습니다. 또한, 게시자 정책 어셈블리를 만든 이후에 가하게 되는 게시자 정책 파일의 변경 사항들은 반영되지 않습니다.


 


5) 항상 “AL” 유틸리티를 사용할 때에는 /link 스위치를 사용하여 게시자 정책 파일을 지정하도록 합니다. /embed 스위치를 사용하지 마십시오. 지원되지 않는 듯합니다.


이 내용과 관련이 있는 링크 – http://msdn.microsoft.com/ko-kr/library/dz32563a.aspx (원문에 소개된 나머지 링크 2개는 이 글이 작성되는 현 시점에서는 유효하지 않아서 제외했습니다.)


1.3. 현재 시스템에서 실행되는 모든 프로세스의 목록을 어떻게 가져옵니까?


System.Diagnostics 네임스페이스의 Process.GetProcesses() 정적 메서드를 사용하시면 됩니다.


 


[C#]


     using System.Diagnostics;


     …


     foreach ( Process p in Process.GetProcesses() )


          Console.WriteLine( p ); // string s = p.ToString();


 


[VB.NET]


     Imports System.Diagnostics


     …


     Dim p As Process


     For Each p In Process.GetProcesses()


          Console.WriteLine(p) ‘ string s = p.ToString()


     Next p


1.4. 현재 시스템에서 GUI 형태로 실행되는 프로그램들 (단순한 창 목록 나열이 아닌)의 목록을 어떻게 가져옵니까?


플랫폼 호출 기능 (P/Invoke)을 이용하여 EnumWindows Win32 API를 호출할 수도 있지만, System.Diagnostics 네임스페이스의 Process.GetProcesses() 정적 메서드를 활용하면 플랫폼 호출 기능으로 발생하는 비용을 최소화하면서 원하는 목적을 쉽게 달성할 수 있습니다.


 


[C#]


     using System.Diagnostics;


     …


     foreach ( Process p in Process.GetProcesses(System.Environment.MachineName) )


     {


          if( p.MainWindowHandle != IntPtr.Zero)


          {


               //this is a GUI app


               Console.WriteLine( p ); // string s = p.ToString();


          }


     }


 


[VB.NET]


     Imports System.Diagnostics


     …


     Dim p As Process


     For Each p In Process.GetProcesses(System.Environment.MachineName)


          If p.MainWindowHandle <> IntPtr.Zero Then


               ‘this is a GUI app


               Console.WriteLine(p) ‘ string s = p.ToString();


          End If


     Next p


1.5. 프로그램을 하나만 실행시킬 수 있도록 하려면 어떻게 해야 합니까?


C# Corner 웹 사이트에 Saar Carmi님이 올려주신 샘플 (http://www.codeproject.com/KB/cs/restricting_instances.aspx) 의 내용에서는, System.Diagnostics 네임스페이스 안의 Process 클래스를 활용하여 이를 구현하고 있습니다.


 


역자 주) 이 방법은 인터넷 상에 알려져 있는 여러 방법들 중 하나를 소개하는 것입니다.


 


[C#]


public static Process RunningInstance()


{


     Process current = Process.GetCurrentProcess();


     Process[] processes = Process.GetProcessesByName (current.ProcessName);


      //Loop through the running processes in with the same name


      foreach (Process process in processes)


      {


          //Ignore the current process


           if (process.Id != current.Id)


          {


               //Make sure that the process is running from the exe file.


                if (Assembly.GetExecutingAssembly().Location.Replace(“/”, “”) == current.MainModule.FileName)


                {


                    //Return the other process instance.


                    return process;


                }


           }


      }


      //No other instance was found, return null.


      return null;


}


 


[VB.NET]


Public Shared Function RunningInstance() As Process


     Dim current As Process = Process.GetCurrentProcess()


     Dim processes As Process() = Process.GetProcessesByName(current.ProcessName)


     ‘Loop through the running processes in with the same name


     Dim process As Process


     For Each process In processes


          ‘Ignore the current process


          If process.Id <> current.Id Then


               ‘Make sure that the process is running from the exe file.


               If [Assembly].GetExecutingAssembly().Location.Replace(“/”, “”) = current.MainModule.FileName Then


                    ‘Return the other process instance.


                    Return process


               End If


          End If


     Next process


     ‘No other instance was found, return null.


     Return Nothing


End Function ‘RunningInstance


1.6. 현재 실행 중인 운영 체제를 파악하려면 어떻게 합니까?


System 네임스페이스의 Environment 클래스를 활용하면 운영 체제 정보를 가져올 수 있습니다.


 


[C#]


     string versionText = Environment.OSVersion.Version.ToString();


 


[VB.NET]


     Dim versionText As String = Environment.OSVersion.Version.ToString()


Version 속성은 Major, Minor와 같이 상세한 정보를 표현하는 멤버를 가지고 있습니다. 참고로, Windows XP의 버전은 5.1입니다.


1.7. 실행 중인 컴퓨터의 모든 IP 주소를 가져오려면 어떻게 합니까?


[C#]


     string s =””;


     System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;


     for (int i = 0; i < addressList.Length; i ++)


     {


          s += addressList[i].ToString() + “n”;


     }


     textBox1.Text = s;


 


[VB.NET]


     Dim s As String = “”


     Dim addressList As System.Net.IPAddress() = Dns.GetHostByName(Dns.GetHostName()).AddressList


     Dim i As Integer


     For i = 0 To addressList.Length – 1


          s += addressList(i).ToString() + ControlChars.Lf


     Next i


     textBox1.Text = s


1.8. 배포 대상 컴퓨터에 .NET Framework가 설치되어있지 않습니다. 이러한 경우 개발된 Windows Forms 응용프로그램을 실행할 수 있습니까?


아니오. 개발한 Windows Forms 응용프로그램을 실행하려면 반드시 배포 대상 컴퓨터에 .NET Framework가 설치되어있어야만 합니다. Microsoft에서 .NET 런타임 플랫폼 설치 패키지를 재 배포가 가능한 형태로 배포를 하고 있으니 참고하시기 바랍니다.



1.9. 실행 중인 EXE 파일의 경로를 가져오려면 어떻게 합니까?


System.Windows.Forms 네임스페이스의 Application.ExecutablePath 정적 속성을 활용하면 알 수 있습니다.


 


[C#]


     textBox1.Text = Application.ExecutablePath;


 


[VB.NET]


     TextBox1.Text = Application.ExecutablePath


1.10. 현재 실행 중인 코드가 어떤 어셈블리로부터 시작되어 실행 중인지 파악하려면 어떻게 합니까?


아래의 코드 단편은 어떤 어셈블리로부터 시작되어 코드가 실행 중에 있는지 파악하는 방법을 보여줍니다.


 


[C#]



MessageBox.Show(System.Reflection.Assembly.GetEntryAssembly().GetName().Name);


 


[VB.NET]



MessageBox.Show(System.Reflection.Assembly.GetEnTryAssembly().GetName().Name)


1.11. 전역 어셈블리 캐시에 어떠한 항목들이 설치되어있는지 어떻게 확인할 수 있습니까?


Windows 탐색기를 활용하여 %windir%Assembly 폴더 (%windir%은 현재 실행 중인 Windows 운영 체제의 기본 설치 경로를 저장하는 시스템 환경 변수입니다.)를 열어보면 알 수 있습니다. 만약 .NET Framework가 설치되어있다면, 이 폴더에 대해 Windows 탐색기가 전용 폴더 보기 화면을 띄워줄 것입니다. 자세히 보기로 보기 설정을 바꾸면 설치된 항목들의 세부 사항을 한눈에 볼 수 있습니다.


1.12. System.Windows.Forms.Application.CompanyName 속성으로 반환되는 값을 수정하려면 어떻게 합니까?


이것은 어셈블리 특성으로부터 가져오는 값입니다. Visual Studio 개발 환경 아래에서는 프로젝트 내에 자동 생성되는 AssemblyInfo 파일 (C# 프로젝트의 경우 AssemblyInfo.cs, Visual Basic .NET 프로젝트의 경우 AssemblyInfo.vb)에 설정됩니다. 여기에는 회사 이름과 더불어 버전 번호 및 여러 가지 세부 설정을 바꿀 수 있습니다. 다음은 코드 예시입니다.


 


[C#]



[assembly: AssemblyCompany(“Syncfusion, Inc.”)]


[VB.NET]



<Assembly: AssemblyCompany(“Syncfusion, Inc.”)>

George Shepherd의 Windows Forms FAQ 번안 – 배포 (Deployment)”에 대한 1개의 생각

  1. 핑백: . ~

댓글 남기기