Languages/C#2017. 11. 30. 14:43

젠킨스를 통해 ClickOnce 배포를 AWS S3에 올리는 설정에 대해서 포스팅합니다.

젠킨스가 설치되었고 MSBuild와 S3 설정과 기본 설정들이 완료된 상태에서 시작합니다.




1. 우선 설치된 nuget 경로를 통해 포함된 package 들을 restore 합니다.

nuget: https://www.nuget.org/downloads


2. 구성하시는 환경에 맞게 MSBuild에 필요한 파라메터를 설정합니다.

Job Notifications 메뉴에서 필요한 매개변수를 설정합니다.



EnableMutipleInstall 은 같은 프로그램을 Configuration 별로 설치할 수 있도록 프로젝트 속성값에 설정한 옵션입니다.

Configuration 에 따라 AssemblyName 과 ProductName 을 변경하면 됩니다.

프로젝트의 csproj 파일을 편집해서 추가하였습니다.


서명에 사용하는 인증서 설정을 MSBuild 나 SignTool 을 사용해서 command 에서 하려고 했으나 제대로 되지 않았습니다. 

그래서 VisualStudio에서 설정하고 MSBuild가 설치된 OS에도 동일한 인증서와 같은 버전의 VisualStudio 를 설치하여 해결하였습니다.


3. S3 설정을 합니다.


추가

- VS2017일 경우 MSBuild 경로

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin


MSB4044 오류 발생시 Jenkins 서비스가 사용자 계정으로 로그인 되어 있는지 확인



'Languages > C#' 카테고리의 다른 글

ClickOnce Custom Publish Page  (0) 2016.12.09
ClickOnce Custom Bootstrap ( Visual C++ redistributable )  (2) 2016.02.23
ClickOnce Custom BootStrapper  (0) 2015.12.01
[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] FTP  (4) 2013.02.26
Posted by 열ㅇl
Languages/C#2016. 12. 9. 18:31

CI를 젠킨스로 하게 되면서 빌드 뿐만 아니라 배포까지 넣게 되었는데 VisualStudio 에서 배포 옵션으로 설정한 배포 웹페이지는 msbuild 로는 생성이 되지 않아서 자료를 찾던 중 커스텀하게 만들 수 있는 방법을 찾게 되었습니다.


원문: https://wallism.wordpress.com/2009/12/08/clickonce-creating-publish-page-from-msbuild/


간단하게 요약하면


1. 템플릿으로 사용할 html 을 만들어 프로젝트에 포함합니다. ( 프로젝트내 Publish 폴더를 만들어 포함했습니다. )

   한글로 변환한 템플릿 첨부합니다.

       

index.template.html


2. .targets 파일을 만들어 프로젝트에 포함합니다. ( Publish.targets 이름으로 만들었습니다. )


3. nuget 으로 MSBuildTasks를 설치합니다.

4. 프로젝트를 편집으로 바꿔서 만든 .targets 파일을 포함합니다. (맨 밑줄에 넣었습니다. )


5. msbuild로 테스트 해보면 다음과 같이 생성됩니다.


msbuild /t:Publish /p:Configuration=Release



'Languages > C#' 카테고리의 다른 글

Jenkins를 통해 AWS 에 ClickOnce 배포  (0) 2017.11.30
ClickOnce Custom Bootstrap ( Visual C++ redistributable )  (2) 2016.02.23
ClickOnce Custom BootStrapper  (0) 2015.12.01
[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] FTP  (4) 2013.02.26
Posted by 열ㅇl
Languages/C#2016. 2. 23. 17:55

ClickOnce 배포시 Bootstrap에서 필요한 버전의 Visual C++ Redistributable 을 추가하기 위한 방법입니다.

 

설치된 Visual Studio 버전의 Bootstrapper\Packages 폴더안에 새로운 폴더를 생성합니다.

vs2015 기준 ( C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages )

 

Visual C++ redistributable 2012을 추가해보겠습니다.

 

기존 vcredist_x86 폴더를 복사 후 이름을 변경합니다.

 

product.xml 파일을 수정합니다.

 

InstallConditions 에서 설치 조건을 설정할 수 있습니다.

XP 일경우 조건들을 수정하거나 주석 처리해주세요.

 

en 폴더 안의 package.xml 파일을 수정합니다.

 

설치할 프로그램을 웹에서 다운 받거나 로컬에 지정할 수 있습니다. 

 

1. 웹에서 다운 받을 경우

 

VCRedistExe 의 경로를 다운 받을 주소로 변경합니다.

<String Name="VCRedistExe">http://go.microsoft.com/fwlink/?LinkID=247126&amp;clcid=0x409</String>

 

<String Name="VCRedistExe">http://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe</String>

 

다음 주소에서 각 버전의 주소를 확인할 수 있습니다.

https://npackd.appspot.com/p/com.microsoft.VisualCPPRedistributable/11.0.61030

 

2. 로컬 파일을 사용할 경우

 

product.xml 파일과 같은 위치에 해당 버전의 redistributable 파일을 다운받아 놓습니다.

product.xml 의 HomeSite를 삭제합니다.

 

<PackageFile Name="vcredist_x86.exe" HomeSite="VCRedistExe"/>

 

<PackageFile Name="vcredist_x86.exe"/>

 

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

Visual C++ 2012 Redistributable (x86) 은 설치 여부 확인이 제대로 되지 않아서 계속 설치하는 문제가 발생하여많은 시도끝에

해결된 방안을 추가합니다.

 

MsiProductCheck 대신 RegistryCheck 를 사용하여 설치된 레지스트리 값을 비교하여 설치여부를 판단했습니다.

 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Dependencies\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}

 

product.xml

 

package.xml

 

reference: https://msdn.microsoft.com/ko-kr/library/ms229432.aspx

   http://stackoverflow.com/questions/12206314/detect-if-visual-c-redistributable-for-visual-studio-2012-is-installed

 

'Languages > C#' 카테고리의 다른 글

Jenkins를 통해 AWS 에 ClickOnce 배포  (0) 2017.11.30
ClickOnce Custom Publish Page  (0) 2016.12.09
ClickOnce Custom BootStrapper  (0) 2015.12.01
[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] FTP  (4) 2013.02.26
Posted by 열ㅇl
Languages/C#2015. 12. 1. 18:42

ClickOnce 필수 구성 요소에 WIC (Windows Imaging Component ) 를 포함 시켜야 하는 경우가 있어서

검색해 보니 해당 Visual Studio 버전의 Bootstrapper 폴더에 패키지를 넣으면 해결.

 

reference: http://wizzard0.livejournal.com/213674.html

 

Visual Studio 2015 기준

C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper

 

의존성을 갖는 경우 해당 .NET Framework 버전 폴더의 Product.xml 파일에 다음 구문을 추가한다.

 

  <RelatedProducts>
    <EitherProducts>
      <DependsOnProduct Code="Microsoft.Windows.Installer.3.1" />
      <DependsOnProduct Code="Microsoft.Windows.Installer.4.5" />
    </EitherProducts>
    <DependsOnProduct Code="Windows.Imaging.Component" />
    <IncludesProduct Code=".NETFramework,Version=v4.0,Profile=Client" />
  </RelatedProducts>

 

하지만 Windows XP, 2003 에서만 WIC를 포함하고 윈도우 비스타 이상부터는 WIC를 포함하면 설치오류가 발생한다.

그래서 윈도우 비스타 이후부터는 ClickOnce로 설치시 설치되지 않도록 수정해줘야 한다.


수정한 product.xml 파일을 첨부한다.


참고 사이트: http://reasty.tistory.com/10


product.xml

wic_bootstrapper_patch.exe


'Languages > C#' 카테고리의 다른 글

ClickOnce Custom Publish Page  (0) 2016.12.09
ClickOnce Custom Bootstrap ( Visual C++ redistributable )  (2) 2016.02.23
[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] FTP  (4) 2013.02.26
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
Posted by 열ㅇl
Languages/C#2013. 8. 6. 10:08

몇 년 전 Audio Device 의 변경을 코드로 제어하기 위해

다소 엉뚱한 방법으로 접근했던 적이 있었습니다. ㅎㅎ

http://shine10ee.blog.me/10090459561

 

오랫만의 여유시간이 생겨

좀 더 리서치를 해보니 좋은 자료들이 많더군요.

 

audioswitch :

https://code.google.com/p/audioswitch/

 

Vista Core Audio API Master Volume Control :

http://www.codeproject.com/Articles/18520/Vista-Core-Audio-API-Master-Volume-Control

 

AudioEndPointController (c++) :

http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/

 

이 중에서 첫 번째 audioswitch 가 c# 으로 되어 있고

Vista Core Audio API Master Volume Control 에는 없는 IPolicyConfig 인터페이스까지 구현되어 있습니다.

 

audioswitch 코드를 인용해서

가장 간단하게 연결된 Audio Device 의 목록을 리스트 박스에 보여주고

선택 시 Default Audio Device 로 설정 되도록 하는 예제를 WPF로 만들어 봤습니다. 

 

 

 

Audio.zip

 

'Languages > C#' 카테고리의 다른 글

ClickOnce Custom Bootstrap ( Visual C++ redistributable )  (2) 2016.02.23
ClickOnce Custom BootStrapper  (0) 2015.12.01
[ C# ] FTP  (4) 2013.02.26
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Struct To Byte, Byte To Struct  (0) 2012.08.17
Posted by 열ㅇl
Languages/C#2013. 2. 26. 18:49

프로젝트마다 FTP 관련 기능들을 사용할 때가 있는데요.

기본 메소드 기능들과 이 기능들을 활용하여 좀 더 다양한 기능들 구현할 때가 많았습니다.

( 디렉토리 존재여부, 경로대로 디렉토리 생성, 디렉토리 모두 삭제, 디렉토리 다운로드, 여러 파일 업로드 등.. )

 

그래서 이러한 기능들을 쉽게 사용할 수 있도록 클래스를 만들어 보았습니다.

 

 

중요 클래스는 Ftp 클래스입니다.

그 외에 관련된 필요 클래스들도 위에 보이는 것처럼 여러 개가 있습니다.

 

아래 그림은 Ftp 클래스의 메소드와 프로퍼티 이벤트입니다.

 

메소드는 WebRequestMethods.Ftp 의 기본 메소드들과 이를 응용한 확장 메소드들이 있습니다.

메소드명을 보시면 어떤 역활을 하는지 알 수 있고, summary 를 달아놔서 사용 시 어렵지는 않으실 겁니다.

 

메소드들 중 업로드와 다운로드 메소드명 뒤에 WC 라고 붙는 메소들이 있는데요.

WebClient 를 이용해서 파일 업로드, 다운로드를 진행하는 메소드이고,

일반적인 메소드는 FtpWebRequest 를 사용하여 진행합니다.

 

프로젝트시 마다 항상 필요성을 느껴서 만들게 된 메소드가 두 가지 있습니다.

DownloadDirectoryAsync( WC ) 메소드는 FTP 에 있는 폴더를 통째로 다운로드 받고,

UploadFileListAsync( WC ) 메소드는 FtpUploadDirectory 리스트를 매개변수로 받아

파일들을 모두 업로드 합니다.

 

업로드 다운로드시 필요 이벤트들을 만들어 놓았습니다.

DownloadDirectoryChanged 는 다운로드는 되는 파일 변경시 발생하고,

UploadFileListChanged 는 업로드 되는 파일 변경시 발생합니다. 

 

소스를 첨부하니 디버깅에 사용하시고, 출처는 밝혀주시면 감사하겠습니다.

사용하시면서 발생하는 문제점들에 대해서 의견 주시면 반영하도록 하겠습니다. 

 

 


 

 

FTP.zip

 

 


'Languages > C#' 카테고리의 다른 글

ClickOnce Custom BootStrapper  (0) 2015.12.01
[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Struct To Byte, Byte To Struct  (0) 2012.08.17
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
Posted by 열ㅇl
Languages/C#2013. 2. 26. 18:44

object를 byte 로, byte를 struct로 변환하는 코드입니다. 

 

public static object ByteToObject(byte[] buffer)

{

    try

    {

        using (MemoryStream stream = new MemoryStream(buffer))

        {

            BinaryFormatter binaryFormatter = new BinaryFormatter();

            stream.Position = 0;

            return binaryFormatter.Deserialize(stream);

        }

    }

    catch (Exception exception)

    {

        Console.WriteLine(exception.ToString());

    }

 

    return null;

}

 

public static byte[] ObjectToByte(object obj)

{

    try

    {

        using (MemoryStream stream = new MemoryStream())

        {

            BinaryFormatter binaryFormatter = new BinaryFormatter();

            binaryFormatter.Serialize(stream, obj);

            return stream.ToArray();

        }

    }

    catch (Exception exception)

    {

        Console.WriteLine(exception.ToString());

    }

 

    return null;

}

'Languages > C#' 카테고리의 다른 글

[ C# ] Change Audio Device  (0) 2013.08.06
[ C# ] FTP  (4) 2013.02.26
[ C# ] Struct To Byte, Byte To Struct  (0) 2012.08.17
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
Posted by 열ㅇl
Languages/C, C++2012. 8. 17. 17:17

C# 에서 C++로 작성된 dll 을 사용할 경우에는 DllImport 를 사용하여 손쉽게 사용할 수 있지만

C++ 에서 C#으로 작성된 dll 을 사용할 경우에는 COM으로 등록하는 작업이 추가적으로 필요합니다.

사용법에 대해서 하나씩 살펴보겠습니다.

 

[ C# dll ]

 

1. C++에서 사용가능한 메소드를 노출시키기 위한 인터페이스를 선언합니다.

 

Tip

 

- Guid 는 Visual Studio의 [ Tools ] - [ Create GUID ] 메뉴를 통해 쉽게 만들 수 있습니다.

- [ComVisible(true)] 대신 다음과 같이 Make assembly COM-Visible을 체크할 수 있습니다.

 

[ComVisible(true)]

[Guid("61EA822A-82BC-4CCE-A0BF-5A24855FF613")]

public interface ICShapSample

{

    void ShowMessage();

}

 

2. 인터페이스를 상속받아 클래스를 구현합니다.

 

[ComVisible(true)]

[ClassInterface(ClassInterfaceType.None)]

[Guid("36EA856C-99E3-4365-B157-6C0D75173F48")]

public class CShapSample : ICShapSample

{

    public void ShowMessage()

    {

        MessageBox.Show("Hello World!!");

    }

}

 

3. dll 을 COM으로 등록합니다.

 

두 가지 방법이 있습니다.

 

1 ) Visual Studio를 관리자 권한으로 실행 시킨 후 다음과 같이 Register for COM interop을 선택한 후 빌드합니다.

 

 

2 ) 커맨드 창을 관리 권한으로 실행시 킨 후 regasm 을 이용해 등록합니다.

- 환경변수가 설정이 되어 있지 않으면

  C:\Windows\Microsoft.NET\Framework\v4.0.30319 ( 설치 버전에 따라 다름 )

  경로에 있는 RegAsm 과 regasm 파일을 dll 폴더에 복사합니다.

  커맨드 창에서 dll 폴더로 이동한 후,

  regasm ClassLibrary.dll /tlb 를 입력 후 실행합니다.

 

[ 등록이 완료되면 tlb 파일이 생성됩니다. ]

 

[ C++ ]

 

tlb 파일을 import 하여 사용합니다.

 

#include <Windows.h>

 

#import "..\ClassLibrary\bin\Debug\ClassLibrary.tlb"

 

using namespace ClassLibrary;

 

void main()

{

             CoInitialize(NULL);

 

             ICShapSamplePtr ptr(__uuidof(CShapSample));

             ptr->ShowMessage();

 

             ptr->Release();

             CoUninitialize();

}

 

[ 실행화면 ]

 

 

CShapDllImport.zip

 

Posted by 열ㅇl
Languages/C#2012. 8. 17. 14:27

Struct 를 Byte 로, Byte 를 Struct 로 변환하는 소스 입니다.

 

public static byte[] StructToByte(object obj)

{

    int size = Marshal.SizeOf(obj);

    byte[] arr = new byte[size];

    IntPtr ptr = Marshal.AllocHGlobal(size);

 

    Marshal.StructureToPtr(obj, ptr, true);

    Marshal.Copy(ptr, arr, 0, size);

    Marshal.FreeHGlobal(ptr);

    return arr;

}

 

public static T ByteToStruct<T>(byte[] buffer) where T : struct

{

    int size = Marshal.SizeOf(typeof(T));

 

    if (size > buffer.Length)

    {

        throw new Exception();

    }

 

    IntPtr ptr = Marshal.AllocHGlobal(size);

    Marshal.Copy(buffer, 0, ptr, size);

    T obj = (T)Marshal.PtrToStructure(ptr, typeof(T));

    Marshal.FreeHGlobal(ptr);

    return obj;

}

 

'Languages > C#' 카테고리의 다른 글

[ C# ] FTP  (4) 2013.02.26
[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Win32 API MouseEvent  (8) 2010.12.07
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
Posted by 열ㅇl
Languages/C#2010. 12. 7. 11:47

Win32 API를 사용해

해당 위치에 마우스 다운, 업 이벤트를 발생하는 예제입니다.

 

 using System.Runtime.InteropServices;

 

 class Win32API

 {

     public const uint WM_LBUTTONDOWN = 0x00000002;

     public const uint WM_LBUTTONUP = 0x00000004;

 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

     public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);

 

     [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]

     public static extern int SetCursorPos(int x, int y);

 }

 

 ex )

       Win32API.SetCursorPos(x, y);

       Win32API.mouse_event(Win32API.WM_LBUTTONDOWN, 0, 0, 0, 0);

       Win32API.mouse_event(Win32API.WM_LBUTTONUP, 0, 0, 0, 0);

 

 

'Languages > C#' 카테고리의 다른 글

[ C# ] Object To Byte, Byte To Byte  (0) 2013.02.26
[ C# ] Struct To Byte, Byte To Struct  (0) 2012.08.17
[ C# ] C# FTP Download  (3) 2010.07.21
[ C# ] Default Sound Device 변경하기  (0) 2010.07.19
[ C# ] XML 쓰고 읽기  (0) 2010.05.21
Posted by 열ㅇl