MSBuild のインライン タスクを作成しています。への参照が必要System.ServiceProcess.dll
です。
次のように、System.ServiceProcess.dll ファイルへのパスをハードコードすると、タスクはうまく機能します。
<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>
ただし、そのパスをハードコーディングしたくありません。
そのまま使う<Reference Include="System.ServiceProcess.dll" />
と error:MSB3755: Could not find reference "System.ServiceProcess.dll"
が出るので、ここはフルパスで書かないといけないと思います。
プロパティには$(FrameworkPathOverride)
既に正しいパスが含まれているため、それを使用しようとしました:
<Reference Include="$(FrameworkPathOverride)\System.ServiceProcess.dll" />
しかし、それは私にエラーを与えます:
C:\path\to\project.csproj(93,3): エラー MSB3754: 参照アセンブリ "C:\Program Files %28x86%29\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.ServiceProcess .dll」は無効です。「指定されたアセンブリ名またはコードベースが無効でした。(HRESULT からの例外: 0x80131047)」[C:\path\to\project.csproj]
にどのようにエスケープ(x86)
されたかに注意してください%28x86%29
。
特に、これは に対してのみ行うようです$(FrameworkPathOverride)
。独自のプロパティを定義して代わりに使用すると、そのプロパティも参照しない限り、問題なく動作します$(FrameworkPathOverride)
。言い換えれば、これは機能します (ただし、まだパスをハードコーディングしています):
<PropertyGroup>
<MyPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5</MyPath>
</PropertyGroup>
// (later, inside <Task />)
<References Include="$(MyPath)\System.ServiceProcess.dll" />
ただし、これは次のパスの検索を報告する同じエラーで失敗します%28x86%29
。
<PropertyGroup>
<MyPath>$(FrameworkPathOverride)</MyPath>
</PropertyGroup>
キックのために、このバリエーションも試しましたが、これも同じエラーで失敗します:
<PropertyGroup>
<MyPath>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath>
</PropertyGroup>
また、すべての場合において、 と の出力<Message Text="$(FrameworkPathOverride)" />
は<Message Test="$(MyPath)" />
同一です。<Message />
タスクは括弧内のエスケープではなく$(FrameworkPathOverride)
、<Reference Include="..." />
isです。うーん。
なぜ は内側 に(x86)
なるのに%28x86%29
内側 に<Reference />
ならないの<Message />
ですか?
なぜそれが起こるの$(FrameworkPathOverride)
です$(MyPath)
か?
$(MyPath)
を参照すると、なぜそれが起こり始めるの$(FrameworkPathOverride)
ですか?
このパスをハードコーディングしないようにするにはどうすればよいですか?