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?
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