2009-12-06 5 views
14

मेरे पास एक सी # प्रोजेक्ट है जिसमें एक टेक्स्ट टेम्पलेट शामिल है। मैं इस टेम्पलेट को परियोजना में सी # कक्षाओं के प्रति प्रतिबिंबित करने के आधार पर कुछ एसक्यूएल उत्पन्न करना चाहता हूं।आप टी 4 के साथ .NET प्रतिबिंब का उपयोग कैसे करते हैं?

टी 4 का उपयोग कर वर्तमान प्रोजेक्ट की सामग्री का उपयोग कैसे करता है? क्या यह संभव है, और यदि हां, तो प्रतिबिंब उपलब्ध है, या क्या यह केवल कच्चे स्रोत तक पहुंच है जिसे तब पार्स किया जाना चाहिए?

अग्रिम धन्यवाद!

+2

http://stackoverflow.com/questions/1153542/t4-code-generation-access-types-in-current-project की डुप्लिकेट? –

उत्तर

4

टी 4 का उपयोग कर वर्तमान प्रोजेक्ट की सामग्री का उपयोग कैसे करता है?

एक तरीका EnvDTE COM घटक का उपयोग करना है। गुगलिंग टी 4 और एनवीडीटीई को कई उदाहरण वापस लाएंगे।

क्या यह संभव है, और यदि हां, प्रतिबिंब उपलब्ध है, या यह सिर्फ कच्चे स्रोत के लिए उपयोग है कि तब पार्स किया जाना चाहिए?

प्रतिबिंब निश्चित रूप से टी 4 से उपलब्ध है। यह ज्यादातर काम करता है जैसा आप उम्मीद करेंगे।

Oleg Sych में सामान्य टी 4 उपयोग परिदृश्यों के बारे में कई महान ब्लॉग प्रविष्टियां हैं, लेकिन वहां टी 4 के लिए भी कई अन्य संसाधन हैं।

+0

प्रतिबिंब आमतौर पर टी 4 के माध्यम से एक खराब विधि माना जाता है क्योंकि यह फाइलों या असेंबली को लॉक करता है ताकि आप इसे संपादित नहीं कर सकें, एनवीडीटीई कॉम में यह कमी नहीं है – Maslow

+0

@ मास्लो: जब भी आप विजुअल स्टूडियो के अंदर टी 4 से किसी भी तरह से डीएलएल तक पहुंचते हैं (प्रतिबिंब या नहीं), डीएलएल लॉक हो जाता है और विजुअल स्टूडियो को बंद किए बिना इसे आसानी से बदला नहीं जा सकता है। मैं व्यक्तिगत रूप से विचार करता हूं कि विजुअल स्टूडियो टी 4 कार्यान्वयन में एक बग (माइक्रोसॉफ्ट की संभावना है कि यह एक कैशिंग सुविधा है)। लॉक एनवीडीटीई के साथ भी होता है, लेकिन आप उस डीएलएल को बदलने की कोशिश नहीं कर रहे हैं, इसलिए आपको यह नहीं पता कि यह लॉक हो गया है और इससे कोई फर्क नहीं पड़ता। इस लॉकिंग मुद्दे में विशेष रूप से प्रतिबिंब के साथ कुछ भी नहीं करना है, यह तब भी होता है जब आप प्रतिबिंब का उपयोग नहीं कर रहे हैं। –

+0

@ माइकल - ओलेग सिंक विशेष रूप से टी 4 के भीतर से प्रतिबिंब का उपयोग नहीं करने के लिए कहते हैं http://stackoverflow.com/questions/1153542/t4-code-generation-access-types-in-current-project मुझे तर्क नहीं पता है, और शायद संदर्भ अलग था, लेकिन मैं इस धागे में जो जोड़ रहा था, मुझे लिंक मिलना चाहिए और इसे प्रारंभिक टिप्पणी में शामिल करना चाहिए था। – Maslow

0
ताला लगा समस्याओं से

जबकि यह does not ताला समस्याओं का समाधान (हालांकि Ive सुना है कि VS2010 करता है), तो आप एक अस्थायी स्थान पर dll कॉपी की कोशिश कर सकते हैं और बस की नकल की जाती विधानसभा का उपयोग ..

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".txt" #> 
<#@ import namespace="System.Reflection" #> 
<#@ import namespace="System.IO" #> 
<#  
var newFileName = System.IO.Path.GetTempFileName(); 
System.IO.File.Copy(@"C:\Development\CustomAssembly.dll",newFileName,true); 

var assembly = Assembly.LoadFrom(newFileName); 
var type = assembly.GetType("CustomAssembly.DummyClass"); 
#> 
<#=newFileName#> 
<#=type#> 
+0

हाँ यह मूल फ़ाइल ताला लगा बचा जाता है, लेकिन ऐपडोमेन एक बार असेंबली लोड करता है और इसे फिर से लोड नहीं करेगा (फ़ाइल नाम के बावजूद)। समाप्त होने पर इसे फिर से उतारने के प्रयोजनों के लिए फ़ाइल को नए ऐप डोमेन में लोड करने में असफल रहा है। –

+0

अंतर्निहित धारा का उपयोग करके बाइट सरणी के रूप में असेंबली लोड करें – sll

4

पूरी तरह से अलग , टी 4 टेम्पलेट के भीतर प्रतिबिंब का उपयोग करके सावधान रहें। वीएस -2010 में टेम्पलेट जनरेटर फ्रेमवर्क के संस्करण 4.0 के खिलाफ चलता है, इसलिए यदि आप 3.5 या उससे कम के लिए कोड उत्पन्न कर रहे हैं तो आप अवांछित निर्भरताओं को पेश कर सकते हैं।

मैंने बीसीएल प्रकारों के लिए ToString पर पैरामीटर रहित या पैरामीटरयुक्त कॉल उत्पन्न करने के लिए प्रतिबिंब का उपयोग करने के बाद, इसे अभी तक कठिन तरीके से पाया है। TimeSpan केवल 2.0 में ToString() है, लेकिन 4.0 ToString(string) कहते हैं: पी