2017-10-11 13 views
0

WiX와 VS 2015를 배우고 있으며이를 이해합니다. 많은 옵션을 발견했습니다 (예 : 설치 프로그램에 데이터를 저장하고 CA와 정보를 얻음). 그러나 한 가지 알아두면 좋은 점이 있습니다. 로그을 사용자 지정 작업뿐만 아니라 설치 프로그램에서 사용하려는 몇 가지 추가 클래스에서 가져올 수 있습니까? 가능한 방법이 있습니까?추가 수업으로 맞춤 동작에서 로그 받기 C# in WiX

편집 : 일부 사람들은 내 질문을 이해하지 못한다고 생각합니다. 그것이 쉬운 예를하려고하는 이유입니다.

[Custom Action] 
public static ActionResult Example (Session session) 
{ 
    session.Log("Beginn of Custom Action 'Example'"); 
    NewPath newPath = new NewPath("any path"); 
    session["NEWPATH"] = newPath.gettingPath(); 
    session.Log("End of Custom Action 'Example'"); 
    return ActionResult.Success; 
} 

그리고 나는 C#에서 별도의 클래스가 필요이 예에서 경로 얻기 위해 : 나는 또한 로그를 얻으려고 싶어

namespace Path 
{ 
    private string _path; 
    class NewPath 
    { 
     public NewPath(string path) 
     { 
     this._path = path; 
     } 
     public string gettingPath() 
     { 
     if(Directory.exists(this._path)) 
     { 
      Directory.CreateDirectory(this._path); 
     } 
     return this._path; 
     } 
    } 
} 

그리고 지금을 먼저 우리는 우리의 사용자 정의 액션이 있습니다에서 클래스 gettingPath 나는이 예제가 이해할 수 있기를 바란다 (실수가 없음 : D)

EDIT 2 : 수업을 끝내기 위해 몇 가지 사항을 추가했다. 은 약간의 예일뿐입니다. 물론 절대적으로 옳지 않습니다.

답변

0

getPath()는 NewPath 클래스의 멤버 메서드입니다. 사용자 지정 작업에서 세션을 로깅하는 유일한 인터페이스는 Session 개체입니다.

세션 개체를 사용자 지정 작업 내의 클래스 (예 : NewPath)에 전달할 수 있습니다.

또 다른 옵션은 맞춤 동작 서명이 포함 된 클래스에 정적 NLog를 정의하는 것입니다.

_logger = LogManager.GetCurrentClassLogger(); 

동일한 세션 개체로 NLog 대상을 구성합니다. 이렇게하면 포함하는 클래스의 아무 곳에서나 _logger를 사용할 수 있습니다. NLog에 대한 자세한 내용은

는, 당신이 이것에 대해 잘못된 길을 가고있는 것 같다 일반적으로

+0

좋은 답변입니다. 그러나 나는 다른 어떤 프로젝트없이 그것을 사용하고 싶다. 아직도 가능합니까? –

0

http://nlog-project.org/를 참조하십시오. 사용자 지정 작업은 배워야 할 마지막 사항이며, Windows Installer가 코드없이 수행 할 수있는 작업을 찾아낸 것입니다. WiX 및 Windows Installer는 모든 클래스에 대한 코딩 프레임 워크가 아닙니다. 가능한 경우 사용자 지정 작업을 피해야하는 데이터 기반 설치입니다. 윅스 발명자/소유자가 사용자 지정 작업이 실패 인정하는 것을 말한다 :

http://robmensching.com/blog/posts/2007/8/17/zataoca-custom-actions-are-generally-an-admission-of-failure/

그래서 대신에 당신이 이미 윅스와 함께 사용할 기본 사용자 지정 작업이 될 수있다 할 원하는 클래스와 코딩, 이야기, Windows Installer 기능 또는 WiX Util 기능. 귀하의 경우 코드에서 사용 경로를 얻으려는 것으로 보입니다. 코딩 문제를 설명하기보다는 코드를 필요로하지 않는 문제를 해결할 수있는 방법이 여러 가지 일 수 있으므로 코드를 사용하여 수행하려고 시도하는 것이 무엇인지 말해야합니다.

코드에는 CreateDirectory 호출도 포함되어 있습니다.이 코드는 1) Windows Installer/WiX가 코드없이이를 수행 할 수 있고 2) 사용자 지정 작업에서 수행하는 모든 작업 (예 : 디렉터리 만들기)이 롤백을 필요로하기 때문에 전혀 권장되지 않습니다 설치가 실패하면 사용자 정의 조치를 삭제하고 사용자 정의 조치 (또는 동등한 경우)를 삭제하여 제거하십시오.가능한 경우 코드를 피해야하는 이유 중 일부입니다.

https://www.firegiant.com/wix/tutorial/

을 어쩌면 책 윅스 :

난 당신이 윅스 튜토리얼을 통해 일을했다고 가정하여 Windows Installer XML에 대한 개발자 가이드뿐만 아니라 모든 예제를 사용할.

로깅은 기본 제공되는 Windows Installer 기능입니다. 로그는/l * vx가 포함 된 msiexec 명령 줄을 사용하여 생성되며 로그 항목이 여기에 포함됩니다. 관리 코드 사용자 지정 작업에서 로깅을 제공하는 세션 개체입니다. 따라서 코드의 다른 위치에서 세션 객체에 액세스 (로깅 수행)하기를 원하므로 C# 프로그래밍 문제 일 수 있습니다. 이 경우 및 예제 코드를 사용하여 NewPath 생성자는 Session 객체를 사용하고 클래스에 로컬 참조를 유지하는 오버로드 만 있으면됩니다. 또는 Session을 매개 변수로 사용하는 getPath 메서드에 과부하가 있습니다.

Win32 세계에서 MsiProcessMessage 및 C++ 사용자 지정 동작을 사용합니다.

+0

좋은 답변이지만 도움이되지 않습니다. 왜냐하면이 대답은 내 질문에 답하지 않기 때문입니다. 나는 새로운 디렉토리를 만들 필요가 없다는 것을 알고있다. WiX는 그 자체로 그것을 할 수 있습니다. 그러나 보여주고 싶지 않은 코드는이 예제보다 더 많은 것을 가지고 있습니다. –

+0

"이 코드는 C# 프로그래밍 질문 일 뿐이므로 코드의 다른 위치에서 세션 개체에 액세스 (로깅)하기를 원합니다.이 경우 예제 코드를 사용하면 NewPath 생성자가 세션 객체이며 클래스에서 로컬 참조를 유지하거나 세션을 매개 변수로 사용하는 getPath 메소드에 과부하가 있습니다. "- 어떻게 그럴 수 있습니까? 그것이 내 질문이다. –