2012-02-26 16 views
14

मैं Microsoft.Web.Publishing.Tasks.dll असेंबली में ट्रांसफॉर्मएक्सएमएल (एक्सडीटी ट्रांसफॉर्म) का लाभ उठाने के लिए नए एमएसबिल्ड इनलाइन टास्क का उपयोग कर रहा हूं।एमएसबिल्ड इनलाइन टास्क - संदर्भ गैर-मानक माइक्रोसॉफ्ट असेंबली

<Task> 
    <Reference Include="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 
    <Reference Include="System.Xml" /> 
    <Using Namespace="System"/> 
    <Using Namespace="System.Linq"/> 
    <Using Namespace="System.IO" /> 
    <Using Namespace="System.Xml"/> 
    <Using Namespace="Microsoft.Web.Publishing.Tasks"/> 
    <Code Type="Fragment" Language="cs">...</Code> 
</Task> 

यह ठीक संकलित करता है तथा DLL लोड किया जाता है, तथापि, जब निष्पादित यह विफल रहता है, क्योंकि यह appbase मार्ग है, जिसमें विधानसभा खोजने की कोशिश कर रहा है:

यहाँ मेरी कार्य क्या (कतरना) की तरह लग रहा है : C:\Windows\Microsoft.NET\Framework\v4.0.30319। मैंने उम्मीद की थी कि मैंने इसे जिस मार्ग पर दिया है उसे देखें।

फ्यूजन लॉग यह दिखाता है:

=== Pre-bind state information ===\r 
    LOG: User = xxx\Kamran\r 
    LOG: DisplayName = Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 
    (Fully-specified)\r 
    LOG: Appbase = file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/\r 
    LOG: Initial PrivatePath = NULL\r 
    Calling assembly : (Unknown).\r 
    ===\r 
    LOG: This bind starts in default load context.\r 
    LOG: Using application configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe.Config\r 
    error MSB4018: LOG: Using host configuration file: \r 
    error MSB4018: LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.\r 
    error MSB4018: LOG: Post-policy reference: Microsoft.Web.Publishing.Tasks, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.DLL.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks.EXE.\r 
    error MSB4018: LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Microsoft.Web.Publishing.Tasks/Microsoft.Web.Publishing.Tasks.EXE.\r 

तो इसे ठीक करने या मैं बजाय एक कार्य विधानसभा बनाने के लिए मजबूर किया जाएगा कोई तरीका है?

+0

बग रिपोर्ट जो गलत तरीके से बंद थी: [एमएसबिल्ड: इनलाइन कार्य संदर्भ के लिए उपयोग किया जाने वाला पथ सम्मानित नहीं किया जाता है] (https://connect.microsoft.com/VisualStudio/feedback/details/768289/msbuild-path-used-for- इनलाइन कार्य-संदर्भ-है-नहीं सम्मानित)। पुन: जमा करना: [एमएसबिल्ड: इनलाइन कार्य संदर्भ के लिए उपयोग किया जाने वाला पथ सम्मानित नहीं किया जाता है (2 ले लो)] (https://connect.microsoft.com/VisualStudio/feedback/details/2285231) – Stijn

+0

बग माइक्रोसॉफ्ट द्वारा पुन: उत्पन्न किया गया है, आप https://github.com/Microsoft/msbuild/issues/594 पर इसकी प्रगति का पालन कर सकते हैं – Stijn

उत्तर

3

मुझे अभी भी इसका असली जवाब चाहिए, लेकिन मैं प्रतिबिंब का उपयोग करके और असेंबली लोड करके इस मुद्दे को हल करने में सक्षम था।

आप पूर्ण स्रोत in my gist देख सकते हैं।

0

Dzone में इस लेख के अनुसार: Web.config transformations आप

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/> 

जोड़ना होगा सिर्फ MSBuild फ़ाइल के सिर में। ऐसा लगता है कि एमएसबिल्ड इसे नहीं ढूंढता है और जीएसी

0

से लोड करने का प्रयास कर रहा है। एक और काम AppDomain.AssemblyResolve का उपयोग कर रहा है। हालांकि, फ्रेमवर्क को असेंबली की आवश्यकता होने से पहले आपको अपने हैंडलर को पंजीकरण करना होगा।

यह सब कुछ टुकड़े के अंदर एक कार्य प्रतिनिधि में डालकर किया जा सकता है। एक और संभावना 'कोड' तत्व की 'प्रकार' विशेषता को 'खंड' के बजाय 'वर्ग' में सेट कर रही है।

असेंबली रीसोल्व का उपयोग करने के बारे में जानकारी के लिए पहले से ही स्टैक ओवरफ्लो पर एक लेख है: How to add folder to assembly search path at runtime in .NET?

अभी भी आदर्श नहीं है, लेकिन मेरे मामले में प्रतिबिंब से क्लीनर।

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