2013-06-12 17 views
6

Piszę wbudowane zadanie dla MSBuild. Wymaga odniesienia do System.ServiceProcess.dll.Wbudowane zadanie MSBuild jest odwoływane nawiasami, czasami

Zadanie działa świetnie, jeśli ciężko kod ścieżka do pliku System.ServiceProcess.dll, tak:

<UsingTask 
    TaskName="MyTask" 
    TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> 
    <Task> 
     <Reference Include="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceProcess.dll" /> 
     <Code Type="Fragment" Language="cs">...working fine...</Code> 
    </Task> 
</UsingTask> 

Jednak wolałbym nie trudno kod tą ścieżką.

Jeśli po prostu używam <Reference Include="System.ServiceProcess.dll" />, pojawia się błąd: MSB3755: Could not find reference "System.ServiceProcess.dll", więc myślę, że muszę użyć pełnej ścieżki tutaj.

Obiekt $(FrameworkPathOverride) zawiera poprawną ścieżkę już, więc starałem się użyć tego:

<Reference Include="$(FrameworkPathOverride)\System.ServiceProcess.dll" /> 

Ale to daje mi błąd:

C:\path\to\project.csproj(93,3): error MSB3754: The reference assembly "C:\Program Files %28x86%29\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceProcess.dll" is invalid. "The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)"[C:\path\to\project.csproj]

zauważyć, jak to uciekł (x86) do %28x86%29.

Warto zauważyć, że robi to tylko dla $(FrameworkPathOverride). Jeśli zdefiniuję własną właściwość i użyję jej zamiast tego, działa ona dobrze, chyba że ta właściwość odwołuje się także do $(FrameworkPathOverride). Innymi słowy, to działa (ale jeszcze mi ciężko kodowania ścieżkę):

<PropertyGroup> 
    <MyPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5</MyPath> 
</PropertyGroup> 

// (later, inside <Task />) 
<References Include="$(MyPath)\System.ServiceProcess.dll" /> 

Jednak to nie powiedzie się z powodu tego samego błędu, że raporty szukasz ścieżkę dla %28x86%29:

<PropertyGroup> 
    <MyPath>$(FrameworkPathOverride)</MyPath> 
</PropertyGroup> 

Tylko kopnięcia, próbowałem również tę odmianę, która również nie powiedzie się z powodu tego samego błędu:

<PropertyGroup> 
    <MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath> 
</PropertyGroup> 

ponadto, we wszystkich przypadkach, wyjście <Message Text="$(FrameworkPathOverride)" /> i <Message Test="$(MyPath)" /> są identyczne. Zadaniejest niedostępne w nawiasie wewnątrz , ale <Reference Include="..." />to. Hmm.

Dlaczego (x86) stać %28x86%29 wewnątrz <Reference /> ale nie wewnątrz <Message />?

Dlaczego to się dzieje dla $(FrameworkPathOverride), a nie dla $(MyPath)?

Dlaczego zaczyna się dziać z $(MyPath), jeśli odwołuje się do $(FrameworkPathOverride)?

Jak mogę uniknąć twardego kodowania tej ścieżki?

+0

Nie mogę się jeszcze zakodowane ścieżkę do pracy mam go jak' < Odniesienie Include = "$ (SolutionDir) ImageTextWriter \ bin \ $ (Konfiguracja) \ ImageTextWriter.dll" /> 'w moim zadaniu, ale budowanie projektu zawsze mówi mi, że nie może znaleźć pliku. Any idea? – dotNET

Odpowiedz

5

Podobna do twojej ostatniej próby, czy próbowałeś następujących sposobów używając funkcji właściwości MSBuild "Unescape"?

<PropertyGroup> 
    <MyPath>$([MSBuild]::Unescape("$(FrameworkPathOverride)"))</MyPath> 
</PropertyGroup> 

Wydaje się, że jest to znany numer "MSBuild 4.0 UsingTask nie może mieć ścieżkę z nawiasów ".. http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have-a-path-with-parentheses

Niestety, nie miałem okazję przetestować ten

+1

Dzięki, to zadziałało! –

+1

Miałem podobny problem i rozwiązałem go przy pomocy [MSBuild] :: Unescape również. – Michael12345

Powiązane problemy