2012-01-12 8 views
5

स्थिति
बस एक विरासत DLL उपयोग कर सकते हैं कैसे पंजीकरण के बिना मैं एक निर्माण प्रणाली है कि कई परियोजना के लिए कई बनाता है कार्यान्वित चलाते हैं। किसी एक निर्माण को प्रभावित करने से बचने के लिए हम बिल्ड उपयोगकर्ता को केवल अपने कार्यक्षेत्र में बंद कर देते हैं। गैर-विशेषाधिकार प्राप्त उपयोगकर्ताओं के रूप में चलाता है जिनके पास केवल कार्यक्षेत्र की लेखन क्षमता होती है।सी # (regsvr32)

चैलेंज
हमारे नए निर्माण के दौरान हम एक विरासत 3rdparty DLL कि कॉम के माध्यम से इसके इंटरफेस को उजागर करता है उपयोग करने के लिए की जरूरत है। देव टीम बिल्ड (regsrv32.exe) को पंजीकृत करना चाहता है लेकिन हमारी बिल्ड सुरक्षा व्यवस्था इस गतिविधि को अवरुद्ध करती है। अगर हम शासन को आराम देते हैं तो तृतीय पक्ष डीएलएल अन्य बिल्डों को प्रभावित करेगा और यदि मेरे पास दो निर्माण हैं जिन्हें दो अलग-अलग संस्करणों की आवश्यकता है, तो गलत संस्करण (एक बहुत ही वास्तविक संभावना) के खिलाफ गलत निर्माण संकलन हो सकता है।

प्रश्न
वहाँ पंजीकरण के अतिरिक्त कोई अन्य विकल्प विरासत DLLs जो कॉम के माध्यम से अपने इंटरफेस का पर्दाफाश को संभालने के लिए कर रहे हैं?

मदद

पीटर

+0

.NET COM में आमतौर पर पंजीकरण करने के लिए इंटरऑप के माध्यम से किया जाता है। .NET में डीएलएल को असेंबली कहा जाता है और इसे कई तरीकों से किया जा सकता है .. परियोजना स्तर पर वीएस आईडीई के माध्यम से संदर्भ जोड़कर, या लोड कोड लिखकर और असेंबली को अनलोड करता है .. द्वारा कॉनफिग फ़ाइल जो असेंबली के संदर्भ के साथ-साथ परियोजना के भीतर उस संदर्भ का उपयोग कर रही है ... जीएसी .. – MethodMan

+0

पंजीकरण जब आप बनाते हैं * कभी * आवश्यक नहीं होता है। COM इंटरफेस का पर्दाफाश करने के लिए एक प्रकार पुस्तकालय का उपयोग करता है। यदि आप Regasm.exe का उपयोग कर रहे हैं तो आप इसे गलत कर रहे हैं। Tlbexp.exe का प्रयोग करें –

उत्तर

2

वहाँ पंजीकरण से मुक्त कॉम पर एक पूर्वाभ्यास यहाँ है: यहाँ

http://msdn.microsoft.com/en-us/library/ms973913.aspx

और कष्टदायी विस्तार: http://msdn.microsoft.com/en-us/library/aa376414 (उस दस्तावेज़ की जड़ वास्तव में यहाँ है: http://msdn.microsoft.com/en-us/library/dd408052)

इसके अलावा, के लिए सामान्य रूप से निर्माण, आप एक टीएलबी फ़ाइल बनाने के लिए Tlbimp या tlbexp का उपयोग करने में सक्षम होना चाहिए जिसका उपयोग आप भवन के लिए कर सकते हैं, यह मानते हुए कि पंजीकरण का बिंदु सफलतापूर्वक संकलित करने में सक्षम है, और विशिष्ट परीक्षण चलाने के लिए नहीं रों।

1
  • आप 3 पार्टी में पहुंच सकते हैं .DLL की आप उन्हें GAC कर सकते हैं, और उन्हें अपनी परियोजना में संदर्भ
  • आप के लिए एक का उपयोग कर जोड़ सकते हैं के लिए धन्यवाद अपने .cs फ़ाइल शीर्षलेख के साथ-साथ संदर्भ पर राइट क्लिक करके प्रोजेक्ट का संदर्भ जोड़ें -> संदर्भ जोड़ें ...
  • आप उपर्युक्त चरण भी कर सकते हैं साथ ही प्रतिलिपि स्थानीय = सत्य को गुणों में सेट कर सकते हैं .dll .. मुझे उम्मीद है कि यह आपको कुछ विचार देता है .. यह ध्यान रखें कि .NET विधानसभाओं कोड प्रबंधित कर रहे हैं तो वहाँ उन 3 पार्टी सेवन के कई तरीके हैं सी # LoadFromAssembly ect की तरह भीतर .DLL के अन्य तरीकों का उपयोग कर ..
  • ऐसे Installshield रूप
1

स्थापना उपकरणों से COM इंटरफ़ेस निकाल सकते हैं डीएलएल और उन्हें रजिस्ट्री में जोड़ें। यह डीएलएल की आत्म-पंजीकरण प्रक्रिया का भी उपयोग कर सकता है (जो मुझे विश्वास है कि regsvr क्या करता है), लेकिन यह Microsoft installer best practice नहीं है।

0

सभी मदद के लिए धन्यवाद। हम शुरुआती बाध्यकारी से देर से बाध्यकारी में बदल गए क्योंकि हमें संकलन समय पर वास्तव में डीएलएल की आवश्यकता नहीं थी। इसने बिल्ड सर्वर से पंजीकरण आवश्यकता को एकीकरण परीक्षण सर्वर पर धक्का दिया (जहां हम इंस्टॉलर को निष्पादित करते हैं जो पंजीकरण को संभालता है)। हम बिल्ड सिस्टम प्रिस्टिन को रखने की कोशिश करते हैं और एकीकरण सिस्टम को आसानी से रीसेट करने की कोशिश करते हैं।

धन्यवाद फिर से पीटर

6

के लिए एक ऐसी ही सवाल करने के लिए अपने मूल जवाब देखें: नेट कोड के बिना COM घटकों का निर्माण सर्वर पर पंजीकृत किया जा रहा है COM घटकों का संदर्भ देता है संकलन करने TFS Build server and COM references - does this work?

एक अच्छा तरीका COMReference की बजाय अपनी परियोजना/निर्माण फ़ाइलों में COMFileReference संदर्भ आइटम का उपयोग करने के लिए। एक COMFileReference आइटम इस तरह दिखता है:

<ItemGroup> 
    <COMFileReference Include="MyComLibrary.dll"> 
    <EmbedInteropTypes>True</EmbedInteropTypes> 
    </COMFileReference> 
</ItemGroup> 

के बाद से दृश्य स्टूडियो COMFileReference के लिए कोई डिजाइनर सहायता प्रदान करता है, तो आप प्रोजेक्ट को संपादित/हाथ से फ़ाइल का निर्माण करना होगा।

एक बिल्ड के दौरान, एमएसबिल्ड COM DLL से टाइप लाइब्रेरी जानकारी निकालता है और एक इंटरऑप असेंबली बनाता है जो कॉलिंग .NET असेंबली में स्टैंडअलोन या एम्बेडेड हो सकता है।

प्रत्येक COMFileReference आइटम में WrapperTool विशेषता भी हो सकती है लेकिन डिफ़ॉल्ट मेरे लिए ठीक काम करने लग रहा था। EmbedInteropTypes विशेषता COMFileReference पर लागू होने के रूप में प्रलेखित नहीं है, लेकिन ऐसा लगता है कि यह इरादा है।

थोड़ा और विस्तार के लिए http://msdn.microsoft.com/en-us/library/bb629388.aspx देखें। यह एमएसबिल्ड आइटम .NET 3.5 के बाद से उपलब्ध है।

यह एक शर्म की बात है कि इस तकनीक के बारे में कोई भी कुछ नहीं जानता है, जो मुझे विकल्पों के मुकाबले आसान लगता है। यह वास्तव में आश्चर्य की बात नहीं है क्योंकि मैं केवल ऑनलाइन उपरोक्त संदर्भ को ही देख सकता हूं। मैंने स्वयं एमएसबिल्ड की माइक्रोसॉफ्ट.कॉमोन.targets फ़ाइल में खोदकर इस तकनीक की खोज की।

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