2013-06-12 8 views
6

मैं एमएसबिल्ड के लिए एक इनलाइन कार्य लिख रहा हूं। इसे 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> 

हालांकि, मैं नहीं बल्कि हार्ड-कोड नहीं है कि पथ:

अगर मैं कड़ी मेहनत से कोड System.ServiceProcess.dll फ़ाइल का पथ, इस तरह काम अच्छा काम करता है।

यदि मैं सिर्फ <Reference Include="System.ServiceProcess.dll" /> का उपयोग करता हूं, तो मुझे एक त्रुटि मिलती है: MSB3755: Could not find reference "System.ServiceProcess.dll", इसलिए मुझे लगता है कि मुझे यहां पूरा पथ उपयोग करना है।

$(FrameworkPathOverride) संपत्ति पहले से ही सही रास्ता होता है, इसलिए मुझे लगता है कि उपयोग करने के लिए करने की कोशिश की:

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

लेकिन वह मुझे एक त्रुटि देता है:

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]

सूचना है कि यह कैसे %28x86%29 में (x86) भाग निकले।

विशेष रूप से, ऐसा लगता है कि यह केवल $(FrameworkPathOverride) के लिए ऐसा करता है। यदि मैं अपनी संपत्ति को परिभाषित करता हूं और इसके बजाए इसका उपयोग करता हूं, तो यह ठीक काम करता है, जब तक कि यह संपत्ति $(FrameworkPathOverride) का संदर्भ न दे। दूसरे शब्दों में, यह काम करता है (लेकिन अभी भी मुझे पथ हार्ड-कोड है):

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

बस के लिए:

<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>$([System.Convert]::ToString("$(FrameworkPathOverride)"))</MyPath> 
</PropertyGroup> 

इसके अलावा, सभी मामलों में, <Message Text="$(FrameworkPathOverride)" /> औरके उत्पादन 10 समान हैं। <Message /> कार्य $(FrameworkPathOverride) के अंदर ब्रांडेसिस से बचने वाला है, लेकिन <Reference Include="..." /> है। हम्म।

(x86)%28x86%29<Reference /> के अंदर क्यों बनता है लेकिन <Message /> के अंदर नहीं?

यह $(FrameworkPathOverride) के लिए क्यों होता है और $(MyPath) के लिए नहीं होता है?

यह $(MyPath) पर क्यों हो रहा है यदि यह $(FrameworkPathOverride) का संदर्भ देता है?

मैं इस पथ को कड़ी-कोडिंग से कैसे बच सकता हूं?

+0

मैं भी एक हार्ड-कोडेड पथ काम करने के लिए नहीं मिल सकता है मैं इसे पसंद' <है संदर्भ शामिल करें = "$ (SolutionDir) ImageTextWriter \ bin \ $ (कॉन्फ़िगरेशन) \ ImageTextWriter.dll" /> 'मेरे कार्य में, लेकिन प्रोजेक्ट का निर्माण हमेशा मुझे बताता है कि यह फ़ाइल नहीं ढूंढ सकता। कोई विचार? – dotNET

उत्तर

5

आपके आखिरी प्रयास के समान, क्या आपने "यूनेस्केप" एमएसबिल्ड प्रॉपर्टी फ़ंक्शन का उपयोग करके निम्न का प्रयास किया है?

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

यह "एमएसबिल्ड 4" नामक एक ज्ञात मुद्दा प्रतीत होता है।0 UsingTask कोष्ठकों के साथ "एक पथ नहीं हो सकते:।। http://connect.microsoft.com/VisualStudio/feedback/details/532677/msbuild-4-0-usingtask-cannot-have-a-path-with-parentheses

दुर्भाग्य से, मैं यह परीक्षण करने का अवसर नहीं पड़ा है

+1

धन्यवाद, यह काम किया! –

+1

मुझे एक ही समस्या थी और इसे [एमएसबिल्ड] :: यूनिस्केप के साथ हल किया गया। – Michael12345

संबंधित मुद्दे