2010-08-04 22 views
20

के समान प्रोजेक्ट में मौजूद T4 टेम्पलेट में प्रकारों का उपयोग करना, मैं अपने प्रोजेक्ट में कुछ संग्रहीत प्रक्रिया सहायक कोड जोड़ने के लिए अपने पहले टी 4 कोड जनरेशन टूल पर काम कर रहा हूं। मैं कस्टम प्रकार बना लिया है (StoredProcedure और StoredProcedureParameter जैसे मेरी कोड पीढ़ी के साथ मदद करने के लिए और मेरे कोड में विधानसभा और नाम स्थान संदर्भ में शामिल हैं:टेम्पलेट

<#@ template debug="false" hostspecific="false" language="VB" #> 
<#@ output extension=".generated.vb" #> 
<#@ assembly name="$(TargetPath)" #> 
<#@ import namespace="StoredProcCodeGenerator" #> 

यह मुझे मेरी टी -4 टेम्पलेट कोड में अपने कस्टम प्रकार का उपयोग करने की अनुमति देता है। हालांकि, क्योंकि मेरे कस्टम प्रकार टी 4 टेम्पलेट कोड के समान प्रोजेक्ट में मौजूद हैं, इसलिए जब मैं विजुअल स्टूडियो को पुनरारंभ किए बिना टेम्पलेट कोड चलाता हूं तो मैं अपने प्रोजेक्ट को पुन: संकलित नहीं कर सकता। यह बहुत मजेदार नहीं है।

मैंने पढ़ा great article जो T4 टूलबॉक्स का उपयोग करके इस सटीक समस्या को संबोधित करता है, लेकिन यह काम नहीं कर रहा है। या तो मैं VolatileAssembly निर्देश गलत या T4 टूलबॉक्स si लागू कर रहा हूं mply स्थापित नहीं किया गया था। मुझे यकीन नहीं है कि टूलबॉक्स सही ढंग से स्थापित हो गया है (मैं विन XP पर वीएस 2010 का उपयोग कर रहा हूं)।

कुछ तरीकों से क्या मैं इस समस्या को ठीक करने में सक्षम हो सकता हूं?

+0

मुझे समझ में नहीं आता है। वीएस -2010 में मैं हर समय टी 4 टेम्पलेट का उपयोग करता हूं, जिसमें टेम्पलेट के समान प्रोजेक्ट में उपयोग किए जाने वाले प्रकारों का उपयोग करना शामिल है, और जब भी मैं सहेजता हूं तो यह बहुत अच्छा काम करता है और टेम्पलेट को फिर से चलाता है - जैसा कि मैं अपेक्षा करता हूं। –

+0

@ किर्क मुझे एहसास नहीं हुआ कि मुझे '<# @ असेंबली नाम =" $ (लक्ष्यपैथ) "#>' को हटाने के पहले '<# @ VolatileAssembly ...' को हटा देना था। मैंने इसे समझाने के लिए एक जवाब जोड़ा है। –

+1

कोई व्यक्ति शुरुआत के निकट tempate के बजाय टेम्पलेट कहने के लिए शीर्षक संपादित कर सकता है? – Maslow

उत्तर

10

आपको पिछले assembly संदर्भ और को हटाने की आवश्यकता है तोVolatileAssembly संदर्भ जोड़ें। यदि आप पहले नियमित assembly संदर्भ को नहीं हटाते हैं, तो आपको एक त्रुटि मिलेगी जब आप VolatileAssembly संदर्भ जोड़ते समय इसे पहले ही जोड़ा जा चुका है।

<#@ template debug="false" hostspecific="false" language="VB" #> 
<#@ output extension=".generated.vb" #> 

<#@ assembly name="$(TargetPath)" #>

<#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" 
    name="$(TargetPath)" #> 
<#@ import namespace="StoredProcCodeGenerator" #> 

अब आप अपनी परियोजना का निर्माण करने और अपने टी -4 टेम्पलेट्स के भीतर है कि परियोजना में परिभाषित प्रकार का उपयोग करने के लिए जारी कर सकते हैं।

+0

जब आपके पास न तो होता है तो क्या होता है? (मेरे पास न तो "असेंबली" और न ही "VolatileAssembly" है और .tt फ़ाइल वाली परियोजना से कक्षाएं हमेशा मेरे लिए उपलब्ध हैं।) –

+0

@ किर्क यह दिलचस्प है। अगर मुझे एक असेंबली संदर्भ शामिल नहीं है, तो मुझे एक त्रुटि मिलेगी कि यह मेरे कस्टम प्रकार नहीं ढूंढ पा रहा है। उदाहरण के लिए, मेरे पास 'StoreProcedure' प्रकार है जिसे मैं अपनी .tt फ़ाइल में उपभोग करता हूं। अगर मैं अपनी असेंबली का संदर्भ नहीं देता, तो वह 'संग्रहीत प्रसंस्करण' प्रकार नहीं ढूंढ पाएगा। –

+2

किर्क, क्या आप शायद वीएस 2008 का उपयोग कर रहे हैं? 2008 में, हमने प्रोजेक्ट संदर्भों से स्थानीय प्रकारों को स्टैडर्ड खोजों के रूप में भी लाया। हमने इसे 2010 में हटा दिया ताकि आपकी टी 4 दुनिया जो वास्तव में आप बना रहे थे उससे अलग हो। हमने टेम्पलेट्स में .NET 4.0 का उपयोग करते समय .NET 2.0 या 3.5 प्रोजेक्ट को लक्षित करने के लिए ऐसा किया। – GarethJ

1

उम्मीद है कि यह उपयोगी है, यह लेने वाली volatileAssembly के उपयोग के मामले में पता चलता है, मैं किसी भी भाग्य बिल्कुल काम करने के लिए इस t4 टेम्पलेट हो रही नहीं हूँ, लेकिन मुझे लगता है कि यह सहायक हो सकता है:

// <autogenerated/> 
// Last generated <#= DateTime.Now #> 
<#@ template language="C#" hostspecific="true"#> 

<#@ assembly name="System" #> 

<#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" name="bin\debug\FrameworkWpf.dll" #> 
<#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" name="bin\debug\FrameworkTestToolkit.dll" #> 
<#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" name="bin\debug\WpfAppTemplate.exe" #> 

<#@ output extension=".cs" #> 

<#@ import namespace="System" #> 
<#@ import namespace="FrameworkTestToolkit" #> 

namespace WpfAppTemplateTest { 
using System; 
using System.Reflection; 
<# 
    // Add new types into the below array: 
    Type[] types = new Type[] { 
typeof(FrameworkWpf.SafeEvent), 
typeof(FrameworkWpf.Mvvm.ControllerBase), 
typeof(FrameworkTestToolkit.PrivateAccessorGeneratorTestClass), 
typeof(WpfAppTemplate.PostController), 
typeof(WpfAppTemplate.ShellController), 
}; 


// Do not modify this code 
foreach (Type type in types) { 
PrivateAccessorGenerator builder = new PrivateAccessorGenerator(type, WriteLine, Error, Warning); 
builder.Generate(); 
} 
#> 
} 

http://blog.rees.biz/Home/unit-testing-and-private-accessors2

1

से तुम भी EnvDte का उपयोग कर कोड चल सकता है:

 <#@ template language="C#" hostspecific="True" debug="True" #> 
    <#@ output extension="cs" #> 
    <#@ assembly name="System.Core" #> 
    <#@ assembly name="System.Xml" #> 
    <#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #> 
    <#@ assembly name="EnvDTE" #> 
    <#@ assembly name="EnvDTE80" #> 
    <#@ assembly name="VSLangProj" #> 
    <#@ import namespace="System.Collections.Generic" #> 
    <#@ import namespace="System.IO" #> 
    <#@ import namespace="System.Linq" #> 
    <#@ import namespace="System.Text" #> 
    <#@ import namespace="System.Text.RegularExpressions" #> 
    <#@ import namespace="System.Xml" #> 
    <#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #> 
    <#@ import namespace="EnvDTE" #> 
    <#@ import namespace="EnvDTE80" #> 
    <#@ import namespace="Microsoft.VisualStudio.TextTemplating" #><# 
    var serviceProvider = Host as IServiceProvider; 
     if (serviceProvider != null) { 
      Dte = serviceProvider.GetService(typeof(SDTE)) as DTE; 
     } 

     // Fail if we couldn't get the DTE. This can happen when trying to run in TextTransform.exe 
     if (Dte == null) { 
      throw new Exception("T4Generator can only execute through the Visual Studio host"); 
     } 

     Project = GetProjectContainingT4File(Dte); 

     if (Project == null) { 
      Error("Could not find the VS Project containing the T4 file."); 
      return"XX"; 
     } 

     AppRoot = Path.GetDirectoryName(Project.FullName) + '\\'; 
     RootNamespace = Project.Properties.Item("RootNamespace").Value.ToString(); 

     Console.WriteLine("Starting processing"); 
     ProcessFileCodeModel(Project); 
    #> 

मैं 012,302 पर एक आधार के रूप में इस का उपयोग करते हुए और भी अधिक कोड पोस्ट किया है

+0

'एनवीडीटीई' क्या है? –

+0

@बेन - संसाधन लिंक – Maslow

+0

शामिल करने के लिए उत्तर संपादित किया गया है, लेकिन इसमें रूट स्ट्रैसस्पेस स्ट्रिंग अक्षर के रूप में है। आप इसे निर्देश के रूप में कैसे उपयोग करते हैं? – William

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