2013-02-26 2 views
1

현재 WiX 프로젝트를 테스트하고 있습니다.WiX 전처리 프로그램 pragma 사용 방법?

최근 필자는 전 처리기 확장에서 ProcessPragma 메서드를 재정 의하여 컴파일 타임에 WiX 소스 코드를 작성할 수 있다는 사실을 발견했습니다. 컴파일러없이 xml 문자열을 반환하는 전 처리기 함수가 있으면 광포 한 것처럼 들립니다. 그래서 나는 그것을 들여다 보았다. 그러나 this wix-users thread의 응답은 매우 간단하고 많이 설명하지 않는다. Google은 그 이상으로 흥미로운 것을 반환하지 않습니다. 그래서 나는 WiX 소스 코드를 통해 더 많은 것을 배웠다. 다음과 같이

방법에 대한 XML 문서는 다음과 같습니다

/// <summary> 
/// Processes a pragma defined in the extension. 
/// </summary> 
/// <param name="sourceLineNumbers">The location of this pragma's PI.</param> 
/// <param name="prefix">The prefix of the pragma to be processed by the extension.</param> 
/// <param name="pragma">The name of the pragma.</param> 
/// <param name="args">The pragma's arguments.</param> 
/// <param name="writer">The xml writer.</param> 
/// <returns>false if the pragma is not defined.</returns> 
/// <comments>Don't return false for any condition except for unrecognized pragmas. 
    Throw errors that are fatal to the compile. use core.OnMessage for warnings and messages.</comments> 

그래서 테스트로, 나는 XmlWriter가 더미 속성을 생산하고 true를 반환했다.

이제 실제로 내 WiX 프로젝트에서 호출하려고합니다. Preprocessor.cs, 나는 발견 다음 프라그 마를 사용하기위한 구문이 될 것이라고 암시

switch (reader.NodeType) 
{ 
    case XmlNodeType.ProcessingInstruction: 
     switch (reader.LocalName) 
     { 
      // other cases such as define, include, foreach, 
      // and other preprocessor directives     
      case "pragma": 
       this.PreprocessPragma(reader.Value, writer); 
       break; 
     } 
     break; 

: <?pragma prefix.name?>

그러나 이것은 나에게 다음과 같은 경고 제공 : The pragma 'prefix.name' is unknown. Please ensure you have referenced the extension that defines this pragma.

나는 느낌 나는이를 올바른 트랙에서, pragma와 관련된 경고를 주지만 솔직히 내가 여기서 뭘하는지 알지 못합니다. 미지의 영역 인 것처럼 보입니다.

누구나 내가 뭘 잘못하고 있는지, 올바른 방향으로 나를 가리키고 있는지 알고 있습니까? 내 프로젝트 문제처럼

UPDATE 보인다. 다른 프로젝트에서 내 확장 프로그램을 사용했고 매력처럼 작동했습니다.

미래에 이것을 읽는 사람은 누구나 인수는 <?pragma prefix.name args?>입니다. 여기서 인수는 문자열입니다. 부수적으로, 재정의 메서드에서 XmlWriter을 닫지 마십시오.

답변

0

먼저 -ext path\to\YourPragmaExtensionAssembly.dllcandle.exe으로 전달했는지 확인하십시오. Candle이 확장을로드하고 AssemblyDefaultWixExtension 속성이 WixExtension에서 상속받은 클래스를 가리키는 지 확인한 다음 PreprocessorExtension 속성을 재정의하는 경우 PreprocessorExtension 클래스를 요청합니다.

WiX 도구 모음의 이후 버전 (v4.0 등)에서 단순화 될 수있는 약간의 배선입니다. 그러나 WiX v3.x 툴셋에는 src\ext\PreProcExampleExtension\wixext이라는 예제가 있습니다.

+0

문제는 내 프로젝트에 있고 확장 자체가 아닌 것 같습니다. 나는 다른 프로젝트에서 그것을 사용해 보았는데 잘 동작했다. – Netfangled