6

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)ですか?

このパスをハードコーディングしないようにするにはどうすればよいですか?

4

1 に答える 1