2013-06-12 14 views
6

MSBuild için bir satır içi görev yazıyorum. System.ServiceProcess.dll için bir başvuru gerektirir. doğrusu AncakMSBuild satır içi görev başvurusu parantez kaçıyor, bazen

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

, ben ederim sabit kodlamamanız bu yolu:

Ben koda böyle System.ServiceProcess.dll dosyasının yolunu, eğer görev harika çalışıyor.

Yalnızca <Reference Include="System.ServiceProcess.dll" /> kullanırsam bir hata iletisi alırım: MSB3755: Could not find reference "System.ServiceProcess.dll", bu yüzden burada tam yolu kullanmam gerektiğini düşünüyorum.

$(FrameworkPathOverride) özellik zaten doğru yolu içerir, bu yüzden o kullanmaya çalıştı:

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

Ama bu bana bir hata verir: o %28x86%29 içine (x86) nasıl kaçtı

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]

Bildirimi.

Özellikle, bu yalnızca $(FrameworkPathOverride) için görünüyor. Kendi mülkümü tanımlarım ve bunun yerine kullanırsam, bu özellik de $(FrameworkPathOverride) referansı olmadıkça çalışır. Başka bir deyişle, bu işleri (ama hala beni yolunu sabit kodlama vardır):

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

Sadece için:

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

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

Ancak bu raporlar %28x86%29 için bir yol aramaya aynı hata ile başarısız tekmeler, ben de aynı hatayla başarısız bu varyasyon, denedik: Ayrıca

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

, her durumda, <Message Text="$(FrameworkPathOverride)" /> veçıktısı 10 aynıdır. <Message /> görevi, içinde parantezden kaçan numaralı değil, <Reference Include="..." />ise'dur. Hmm.

(x86) neden <Reference /> içinde %28x86%29 haline gelir, ancak <Message /> içinde değil?

Neden $(FrameworkPathOverride) için ve $(MyPath) için değil?

$(FrameworkPathOverride) başvuruyorsa neden $(MyPath) için başlıyor?

Bu yolu kodlamayı nasıl önleyebilirim?

+0

Çalışmak için bile kodlanmış yolunu alamayan ben <' gibi buna sahip Referans = Görevimdeki "$ (SolutionDir) ImageTextWriter \ bin \ $ (Yapılandırma) \ ImageTextWriter.dll" /> 'i, ancak projeyi oluşturmak her zaman dosyanın bulamadığını söyler.Teşekkür fikirim? – dotNET

cevap

5

Son denemenize benzer şekilde, "Unescape" MSBuild Özellik İşlevini kullanarak aşağıdakileri denediniz mi? Sürüm (MSBuild 4) adlı bilinen bir sorun gibi görünüyor.0 UsingTask "parantez içeren bir yol olamaz.:., Bunu test etmek için fırsatım olmadı maalesef http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have-a-path-with-parentheses

+1

Teşekkürler, Çalıştı! –

+1

Benzer bir problem yaşadım ve [MSBuild] :: Unescape ile de çözdüm. – Michael12345